2010-08-29 3 views
5

Ich versuche, alle Datensätze aus einer SQLite db ich habe mit sqlalchemy, Schleife über jede einzelne und ein Update darauf. Ich tue das, weil ich Neuformatierung jemals in meinem Namenspalte aufnehmen muss.sqlalchemy Datenbanktabelle ist gesperrt

Hier ist der Code, den ich einen einfachen Test zu tun, bin mit:

def loadDb(name):  

     sqlite3.connect(name)  
     engine = create_engine('sqlite:///'+dbPath(), echo=False)  
     metadata = MetaData(bind=engine) 

     return metadata 

    db = database("dealers.db") 
    metadata = db.loadDb() 
    dealers = Table('dealers', metadata, autoload=True) 

    dealer = dealers.select().order_by(asc(dealers.c.id)).execute() 

    for d in dealer: 
     u = dealers.update(dealers.c.id==d.id) 
     u.execute(name="hi") 

     break 

ich den Fehler bekommen:

sqlalchemy.exc.OperationalError: (OperationalError) database table is locked u'UPDATE dealers SET name=? WHERE dealers.id = ?' ('hi', 1) 

Ich bin sehr neu nicht sqlalchemy und ich bin sicher, was dieser Fehler bedeutet oder wie es zu beheben ist. Das scheint eine wirklich einfache Aufgabe zu sein, also weiß ich, dass ich etwas falsch mache.

Antwort

4

Mit SQLite können Sie die Datenbank nicht aktualisieren, während Sie die Auswahl noch ausführen. Sie müssen die Select-Abfrage erzwingen, um alle Daten zu beenden und zu speichern, und dann Ihre Schleife ausführen. Ich denke, dies würde den Job (ungetestet):

dealer = list(dealers.select().order_by(asc(dealers.c.id)).execute()) 

Eine weitere Möglichkeit, eine etwas kompliziertere SQL-Anweisung zu machen wäre, so dass die Schleife in der Datenbank ausgeführt wird, anstatt in Python. Das wird Ihnen sicherlich einen großen Leistungsschub geben.

+0

Option eins wird nicht funktionieren ... mehr Tipps mit Option zwei? Im Grunde versuche ich nur, alle nicht-ASCII-Zeichen aus einer meiner db-Spalten zu entfernen. – imns

+0

Re: "Option eins wird nicht funktionieren" Sie können keine Liste aus den ausgewählten Datenbankobjekten erstellen? Warum nicht? – hughdbrown

+0

Also ich weiß, das ist super spät auf die Party, aber wenn die Leute in Zukunft in diese geraten, fand ich das Schließen aller geöffneten Konsolen, die auf die DB zugreifen, löscht dieses Problem. – ExperimentsWithCode