加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – sqlalchemy数据库表已被锁定

发布时间:2020-12-16 22:22:06 所属栏目:Python 来源:网络整理
导读:我试图从sqlalchemy的sqlite db中选择所有记录,遍历每个记录并对其进行更新.我这样做是因为我需要在我的名字栏中重新格式化记录. 这是我用来做一个简单测试的代码: def loadDb(name): sqlite3.connect(name) engine = create_engine('sqlite:///'+dbPath(),

我试图从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很新,我不确定这个错误是什么意思或者如何修复它.这似乎应该是一个非常简单的任务,所以我知道我做错了什么.

最佳答案
使用SQLite,在执行select时无法更新数据库.您需要强制select查询完成并存储所有数据,然后执行循环.我认为这样做(未经测试):

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

另一个选择是制作一个稍微复杂的SQL语句,以便循环在数据库内而不是在Python中执行.这肯定会给你带来很大的性能提升.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读