murph hat geschrieben:wäre für jede meinung sehr dankbar
Hi murph!
Sieht nicht schlecht aus. Ich hätte nur ein paar Kleinigkeiten und eine Sache, die du komplett vergessen hast. --> die
Docstrings.
Damit der Code auch später unter Python 2.5 läuft, ohne pySQLite extra installieren zu müssen, schlage ich vor, den Import so zu gestalten:
Code: Alles auswählen
try:
import sqlite3 # Ab Python 2.5
except:
from pysqlite2 import dbapi2 as sqlite3
Vielleicht lagerst du den Namen "root.db" in eine Konstante oder gar in eine eigene Datei, z.B. eine INI-Datei, aus.
Ich persönlich, erstelle statt einer richtigen Konstante, so etwas gibt es in Python nicht, einfach eine großgeschriebene Variable unterhalb der Imports. Das ist für mich das Zeichen, dass es sich um eine Variable handelt, die im Code nicht verändert werden soll.
Code: Alles auswählen
#: Gibt den Namen zur Einstellungsdatenbank an.
ROOT_DB_NAME = "root.db"
...
...
self.conn[0] = sqlite.connect("ROOT_DB_NAME")
Hinweis: Kommentare, die mit (#:) beginnen, werden seit neuestem in EpyDoc
http://epydoc.sourceforge.net/ als Kommentare angezeigt. So kann man endlich wichtige Variablen oder Properties auch so kommentieren, dass diese in EpyDoc berücksichtigt werden.
Code: Alles auswählen
def connect(self):
self.i = 1 #<-to prevent that root (0) is touched
self.dblist = []
self.root_cur.execute("SELECT name FROM INFO")
for name in self.root_cur.fetchall():
self.conn[i] = sqlite.connect(name)
...
...
In diesem Codeabschnitt verstehe ich noch nicht woher du die Variable "i" nimmst. Zuerst verwendest du "self.i" und dann nur noch "i".
Ich hatte schon ein paar Probleme mit großgeschriebenen Tabellennamen. Auch wenn das nicht sein muss, aber klein geschriebene Feld- und Tabellennamen machen es einem ab und zu leichter. Ganz besonders auch im Zusammenspiel mit Zope und beim Umsteigen auf andere Datenbanksysteme, da einige die Groß-Kleinschreibung ignorieren und andere nicht.
Code: Alles auswählen
self.root_cur.execute("SELECT name FROM INFO")
self.killlist = self.root_cur.fetchall()
for i in xrange(len(self.killlist)):
self.cur[i].close()
self.conn[i].close()
self.cur[0].close()
self.conn[0].close()
Den verstehe ich nicht ganz. Du lässt dir alle Namen aus der Tabelle INFO zurück geben, verwendest sie aber nicht.
gibt dir die Anzahl der Namen zurück. Damit kannst du dann direkt arbeiten.
EDIT:
Code: Alles auswählen
class Execute(Connection):
def execute(self,userid,sql):
self.cur = Connection.cur[self.userid]
self.cur.execute(sql)
self.fetched = self.cur.fetchall()
if self.fetched:
return self.fetched
else:
return None
Hier erbst du von der Klasse Connection, initialisierst sie aber nicht und ... den rest verstehe ich noch nicht.
Das nehme ich zurück. Ich habe übersehen, dass du die __init__ ja nicht überschreibst. Damit musst du die geerbte __init__ auch nicht explizit aufrufen.
lg
Gerold
:-)