繁体   English   中英

SQLAlchemy(无ORM):更新语句未提交

[英]SQLAlchemy (no ORM): update statement not committing

我的数据库模块中有此(匿名)功能:

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数据库。
  • 如果很重要,则绑定值之一有时为None /
  • 此代码(以不同的方式进行匿名化)也无法正常工作:

     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() 

我认为在不使用ORM对象的情况下,Sessions不会管理事务。 但是您可以直接在引擎上使用事务:

with engine.begin() as conn:
    conn.execute(...)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM