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.
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
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
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