我正在編寫一個快速的一次性遷移腳本,該腳本更新一個包含50萬行的表中的單個字段。SQLalchemy 0.7的任何示例,使用from_statement()的UPDATE
因爲我沒有計劃寫出完整的模型,我正在做的初始~25000行數據,我一直在想弄清楚如何使用from_statement做一個UPDATE語句( )調用並使用我自己的原始sql,但我找不到任何示例。
除此之外,SQLalchemy正在拋出一個錯誤。這裏是我的電話和錯誤的例子:
mydb = self.session()
mydb.query().from_statement(
"""
UPDATE my_table
SET settings=mysettings
WHERE user_id=myuserid AND setting_id=123
""").params(mysettings=new_settings, myuserid=user_id).all()
的錯誤,我得到:
Traceback (most recent call last):
File "./sample_script.py", line 111, in <module>
main()
File "./sample_script.py", line 108, in main
migrate.set_migration_data()
File "./sample_script.py", line 100, in set_migration_data
""").params(mysettings=new_settings, myuserid=user_id).all()
File "/usr/lib/pymodules/python2.6/sqlalchemy/orm/query.py", line 1267, in all
return list(self)
File "/usr/lib/pymodules/python2.6/sqlalchemy/orm/query.py", line 1361, in __iter__
return self._execute_and_instances(context)
File "/usr/lib/pymodules/python2.6/sqlalchemy/orm/query.py", line 1364, in _execute_and_instances
result = self.session.execute(querycontext.statement, params=self._params, mapper=self._mapper_zero_or_none())
File "/usr/lib/pymodules/python2.6/sqlalchemy/orm/query.py", line 251, in _mapper_zero_or_none
if not getattr(self._entities[0], 'primary_entity', False):
IndexError: list index out of range
UPDATE我使用MySQL
。
每薩米的建議下,我嘗試這樣做:
mydb.execute(
"UPDATE mytable SET settings=:mysettings WHERE user_id=:userid AND setting_id=123",
{'userid': user_id, 'mysettings': new_settings}
)
這是沒有效果的。我沒有得到任何錯誤,但該聲明似乎並未實際執行,因爲該行不會改變。如果我手動剪切並粘貼從echo = True選項獲取的查詢,該行在數據庫中更新就好了。
更新 - 解決
薩米的建議是正確的,但.execute()調用只適用於 '引擎',而不是 '會議',所以這工作就好了:
self.engine.execute(
"UPDATE mytable SET settings=:mysettings WHERE user_id=:userid AND setting_id=123",
{'userid': user_id, 'mysettings': new_settings}
)
Hi Samy,我也嘗試按照你的建議使用execute()(請參閱我的原始問題中的更新),但它似乎並未實際運行。 – iandouglas
確保你刷新會話,'mydb.flush()' –
我沒有嘗試session.flush,但使用引擎本身執行查詢就好了。再次感謝您的幫助。 – iandouglas