2013-06-28 17 views
7

Sto cercando di implementare un semplice programma di database in python. Ottengo al punto in cui ho aggiunto elementi al db, ha cambiato i valori, eccimplementazione del database python

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() 

Ora, come un passo successivo voglio essere in grado di fare le transazioni nidificate all'interno di questo pitone code.I iniziare un set di comandi con il comando BEGIN e quindi li commit con istruzione COMMIT. Un commit dovrebbe impegnare tutte le transazioni iniziate. Tuttavia, un rollback dovrebbe riportare le modifiche al BEGIN recente. Non sono in grado di trovare una soluzione adeguata per questo.

risposta

4

Un approccio semplice è quello di mantenere una lista di "transazione" che contiene tutte le informazioni necessarie per essere in grado di roll-back modifiche in sospeso:

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

Questo era esattamente quello che stavo cercando. Grazie mille per la risposta. –

0

Tutto questo è disponibile gratuitamente nella costruito nel modulo di sqllite . I commit e rollback per SqlLite sono discussi in modo più dettagliato di quanto io possa capire here

0

Se si sta facendo questo come un esercizio accademico, si potrebbe voler controllare la ricetta Rudimentary Database Engine sul Python Cookbook. Include alcune classi per facilitare ciò che potresti aspettarti da un motore SQL.

  • Database è creare istanze di database, senza il supporto delle transazioni.
  • Database2 eredita da Database e fornisce transazioni tabella.
  • La tabella implementa tabelle di database insieme a varie interazioni possibili.

Diverse altre classi fungono da utilità per supportare alcune azioni del database che normalmente verrebbero supportate.

  • Come e NotLike implementare l'operatore COME si trovano in altri motori.
  • data e datetime sono tipi di dati speciali utilizzabili per colonne del database.
  • DatePart, MID, e FORMATO consentono la selezione informazioni in alcuni casi.

Oltre alle classi, ci sono funzioni per ISCRIVITI operazioni insieme con test/dimostrazioni.

+0

Grazie per la risposta. Stavo cercando di implementare il mio codice Python per un semplice database. –