首页 > 解决方案 > Sqlalchemy 在将更新放入 for 循环时给出数据库锁定错误

问题描述

有 2 个表 A 和 B。两者都有名为 master 和 slave 的列。表 A 的主值必须更新为表 B 的主值(对于表 A 和表 B 中具有相同从值的行)。

由于 Sqlite 没有 join 方法并且不支持多表更新,我不得不考虑其他选项。

以下代码有效。


tableB = Table('table_B', metadata, autoload=True)
tableA = Table('table_A', metadata, autoload=True)


ku = tableA.update().where(tableA.c.master == "All for One" ).values(master = "Shigaraki Tomura")
ku.execute()

但是当我尝试在 .values() 中使用不同的值时,事情变得一团糟

ls = select(columns=[tableA.c.master,tableB.c.master], whereclause=tableA.c.slave == tableB.c.slave).distinct()
rows = ls.execute()

for i,j in rows:
    ku = tableA.update().where(tableA.c.master == i).values(master = j)
    ku.execute()

以下是错误消息

    File "/home/ehaacls/miniconda/lib/python3.7/site-packages/sqlalchemy/engine/default.py", line 505, in do_commit
        dbapi_connection.commit()
    sqlite3.OperationalError: database is locked

    raise exc.ResourceClosedError("This Connection is closed")
    sqlalchemy.exc.ResourceClosedError: This Connection is closed

标签: python-3.xsqlitesqlalchemy

解决方案


推荐阅读