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

我认为如果不使用ORM对象,会话将无法管理事务。但您可以直接使用引擎上的事务:

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()应该提交内部事务。我知道刷新应该是不必要的,但我已经绝望了。:)