1

データベースモジュールにこの(匿名化された)関数があります:

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を介してOracle11データベースを使用しています。
  • 重要な場合、バインドされた値の1つが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()
    
4

1 に答える 1

0

セッションが ORM オブジェクトを使用せずにトランザクションを管理するとは思いません。ただし、エンジンでトランザクションを直接使用することもできます。

with engine.begin() as conn:
    conn.execute(...)
于 2012-10-19T23:42:46.467 に答える