2010-08-29 7 views
5

J'essaie de sélectionner tous les enregistrements d'une base de données sqlite que j'ai avec sqlalchemy, faites une boucle sur chacun d'eux et faites une mise à jour dessus. Je fais cela parce que j'ai besoin de reformater un enregistrement dans la colonne de mon nom.La table de base de données sqlalchemy est verrouillée

Voici le code que je utilise pour faire un test simple:

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 

Je reçois l'erreur:

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

Je suis très nouveau pour sqlalchemy et je ne suis pas sûr de ce que cette erreur signifie ou comment le réparer. Cela semble être une tâche très simple, alors je sais que je fais quelque chose de mal.

Répondre

4

Avec SQLite, vous ne pouvez pas mettre à jour la base de données tant que vous effectuez la sélection. Vous devez forcer la requête de sélection pour terminer et stocker toutes les données, puis effectuez votre boucle. Je pense que ce serait faire le travail (non testé):

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

Une autre option serait de faire une déclaration SQL un peu plus compliquée de sorte que la boucle s'exécute dans la base de données au lieu de Python. Cela va certainement vous donner un gros coup de pouce de performance.

+0

La première option ne fonctionnera pas ... plus de conseils avec l'option deux? Fondamentalement, je suis en train d'essayer de supprimer tous les caractères non-ascii de l'une de mes colonnes db. – imns

+0

Re: "l'option 1 ne fonctionnera pas" Vous ne pouvez pas faire une liste à partir des objets de base de données sélectionnés? Pourquoi pas? – hughdbrown

+0

Donc, je sais que c'est super en retard à la fête, mais si les gens dans le futur se heurtent à cela, j'ai trouvé que la fermeture de toutes les consoles ouvertes qui accèdent à la db règle ce problème. – ExperimentsWithCode

Questions connexes