2013-06-28 4 views
7

Ich versuche, ein einfaches Datenbank-Programm in Python zu implementieren. Ich an den Punkt kommen, wo ich Elemente der db hinzugefügt haben, verändert die Werte usw.Python Datenbank-Implementierung

class db: 
    def __init__(self): 
      self.database ={} 

    def dbset(self, name, value): 
      self.database[name]=value 

    def dbunset(self, name): 
      self.dbset(name, 'NULL') 

    def dbnumequalto(self, value): 
      mylist = [v for k,v in self.database.items() if v==value] 
      return mylist 

def main(): 
    mydb=db() 
    cmd=raw_input().rstrip().split(" ") 
    while cmd[0]!='end': 
      if cmd[0]=='set': 
        mydb.dbset(cmd[1], cmd[2]) 
      elif cmd[0]=='unset': 
        mydb.dbunset(cmd[1]) 
      elif cmd[0]=='numequalto': 
        print len(mydb.dbnumequalto(cmd[1])) 
      elif cmd[0]=='list': 
        print mydb.database 
      cmd=raw_input().rstrip().split(" ") 

if __name__=='__main__': 
    main() 

nun als nächsten Schritt möchte ich eine in dieser Python verschachtelte Transaktionen zu tun, um der Lage sein, code.I beginnen Reihe von Befehlen mit BEGIN-Befehl und dann commit sie mit COMMIT-Anweisung. Ein Commit sollte alle begonnenen Transaktionen festschreiben. Ein Rollback sollte die Änderungen jedoch auf den letzten BEGIN zurücksetzen. Dafür kann ich keine geeignete Lösung finden.

Antwort

4

Ein einfacher Ansatz ist es, eine „Transaktion“ Liste zu halten alle Informationen enthält, die Sie Rollback bis zu Änderungen in der Lage sein müssen:

def dbset(self, name, value): 
    self.transaction.append((name, self.database.get(name))) 
    self.database[name]=value 

def rollback(self): 
    # undo all changes 
    while self.transaction: 
     name, old_value = self.transaction.pop() 
     self.database[name] = old_value 

def commit(self): 
    # everything went fine, drop undo information 
    self.transaction = [] 
+0

Das war genau das, was ich suchte. Vielen Dank für die Antwort. –

0

Dies alles kostenlos im eingebauten sqllite Modul zur Verfügung steht . Die Commits und Rollbacks für SQLLite werden ausführlicher diskutiert, als ich here

0

verstehen Wenn Sie dies als eine akademische Übung tun, könnten Sie die Rudimentary Database Engine Rezept auf der Python-Kochbuch zu sehen. Es enthält einige Klassen, um das zu erleichtern, was Sie von einer SQL-Engine erwarten können.

  • Die Datenbank erstellt Datenbankinstanzen ohne Transaktionsunterstützung.
  • Database2 erbt von Datenbank und bietet für Tabellentransaktionen.
  • Tabelle implementiert Datenbanktabellen zusammen mit verschiedenen möglichen Wechselwirkungen.
  • Mehrere andere Klassen dienen als Hilfsprogramme zur Unterstützung einiger Datenbankaktionen, die normalerweise unterstützt werden.

    • Wie und NOTLIKE die in anderen Motoren gefunden LIKE Operator implementieren.
    • Datum und datetime sind spezielle Datentypen für Datenbankspalten.
    • Datepart, MID und FORMAT Informationen Auswahl in einigen Fällen ermöglichen.

    Neben den Klassen gibt es Funktionen für JOIN Operationen zusammen mit Tests/Demonstrationen.

    +0

    Danke für die Antwort. Ich wollte meinen eigenen Python-Code für eine einfache Datenbank implementieren. –