我正在尝试从sqlalchemy的sqlite db中选择所有记录,遍历每个记录并对其进行更新。我这样做是因为我需要在我的名字栏中重新格式化记录。
以下是我用来做简单测试的代码:
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
我收到了错误:
sqlalchemy.exc.OperationalError: (OperationalError) database table is locked u'UPDATE dealers SET name=? WHERE dealers.id = ?' ('hi', 1)
我对sqlalchemy很新,我不确定这个错误是什么意思或者如何修复它。这似乎应该是一个非常简单的任务,所以我知道我做错了什么。
答案 0 :(得分:4)
使用SQLite,在执行select时无法更新数据库。您需要强制select查询完成并存储所有数据,然后执行循环。我认为这样做(未经测试):
dealer = list(dealers.select().order_by(asc(dealers.c.id)).execute())
另一种选择是制作一个稍微复杂的SQL语句,以便循环在数据库内而不是在Python中执行。这肯定会给你带来很大的性能提升。