sqlalchemy 数据库表被锁定

5 投票
1 回答
4780 浏览
提问于 2025-04-16 03:27

我正在尝试从一个sqlite数据库中选择所有记录,使用sqlalchemy来实现。我想逐个遍历这些记录,并对它们进行更新。这样做是因为我需要重新格式化我名字这一列中的每一条记录。

这是我用来做简单测试的代码:

   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还很陌生,不太明白这个错误是什么意思,也不知道该怎么解决。这个任务看起来应该很简单,所以我知道我一定是哪里做错了。

1 个回答

3

在使用SQLite的时候,如果你正在进行查询(也就是选择数据),就不能同时更新数据库。你需要先让查询完成,把所有数据都存好,然后再进行后面的操作。我觉得下面这个方法可以解决这个问题(不过我没有测试过):

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

还有一个选择是,可以写一个稍微复杂一点的SQL语句,这样循环就可以在数据库内部执行,而不是在Python里面。这样做肯定会让你的程序运行得更快。

撰写回答