2010-08-29 51 views
5

我想从sqlalchemy的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的,我不确定这个错误意味着什么或如何解决它。这似乎应该是一个非常简单的任务,所以我知道我做错了什么。

回答

4

使用SQLite,当您仍在执行选择时,无法更新数据库。您需要强制选择查询来完成并存储所有数据,然后执行循环。我认为这将做的工作(未经测试):

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

另一种选择是做一个稍微复杂的SQL语句,以便循环使用Python的数据库内,而不是执行。这肯定会给你一个很大的性能提升。

+0

方案一不会奏效......对方案二有更多的建议吗?基本上我只是试图从我的数据库的列中删除所有非ASCII字符。 – imns 2010-08-30 03:11:25

+0

回复:“选项一不工作”您无法从选定的数据库对象中创建一个列表?为什么不? – hughdbrown 2010-09-23 16:08:48

+0

所以我知道这对派对来说太晚了,但是如果将来有人遇到这个问题,我发现关闭所有打开数据库的开放式控制台会清除这个问题。 – ExperimentsWithCode 2016-08-14 02:33:38