データベースモジュールにこの(匿名化された)関数があります:
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()