Python SQLAlchemy(无ORM):更新语句未提交
我的数据库模块中有以下(匿名)功能:Python SQLAlchemy(无ORM):更新语句未提交,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,我的数据库模块中有以下(匿名)功能: def fix_publishing_dates(row_id, last_time=None, next_time=None, next_index=1, user="python_script"): sql = """ UPDATE schema.table SET last_time = :last_time , next_time = :next_time , next_index = :next_inde
def fix_publishing_dates(row_id, last_time=None, next_time=None,
next_index=1, user="python_script"):
sql = """
UPDATE
schema.table
SET
last_time = :last_time
, next_time = :next_time
, next_index = :next_index
, col4 = SYSDATE
, col5 = :user_id
, is_active = 1
WHERE
id = :row_id
"""
with closing(Session()) as s:
with s.begin_nested():
user_id = get_userid_by_name(user)
args = dict(
last_time=last_time,
next_time=next_time,
next_index=next_index,
row_id=row_id,
user_id=user_id,
)
s.execute(sql, args)
s.flush()
s.commit()
出于某种原因,这是行不通的。我在上面的表中查询is_active=1,得到零行。我是不是做错了什么
注
我不想使用SQLAlchemy ORM并为此添加大量样板表类*;我喜欢使用Session()和文本查询来支持事务
*:也不要因为内省而放慢我的启动时间;此数据库的网络管道速度较慢
编辑1
- 我正在通过cx_Oracle使用Oracle 11数据库
- 在重要的情况下,其中一个界限值有时是无的/
- 此代码(匿名方式不同)也不起作用:
def fix_publishing_dates(**kwargs): sql = insert_query_here user_id = get_userid_by_name(user) args = dict(kwargs) print "*" * 50 print "* About to update database with values: {}".format(args) print "*" * 50 result = engine.execute(sql, args) print "Row count is:", result.rowcount #import ipdb;ipdb.set_trace() #s.commit()
with engine.begin() as conn:
conn.execute(...)
您使用的是哪个数据库和哪个版本?其中一些不允许嵌套事务。请使用create_engine()启用echo=True以查看是否发出了所需的SQL,还可以获取s.execute()的结果并查看result.rowcount是否为非零。flush()也是完全多余的(就像begin_nested()一样,真的,但也许你有更复杂的IRL)我目前只有一个真正需要事务的函数。这一个都是INSERT语句,它与原始SQL和会话()配合得很好。好吧,会话确实执行事务,但是如果您只发出原始SQL,那么就没有太多理由使用会话。flush()也是不必要的。我不确定更新最初失败的原因,但是,with begin_nested()应该提交内部事务。我知道刷新应该是不必要的,但我已经绝望了。:)