2010-08-29 53 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