SQLObject の lazyUpdate 機能を使用しようとしていますが、データが破壊されています。クラス定義はこちら
class T(sqlobject.SQLObject):
class sqlmeta:
lazyUpdate = True
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
if self.sqlmeta.dirty:
self.syncUpdate()
return False
foo = IntCol()
bar = IntCol(default=None)
コンテキスト マネージャーの関数は次のように記述できます。
with T.select().getOne() as t:
# update t
オブジェクトを作成しているときは、すべて正常に動作しているようです。ただし、オブジェクトを読み取っているときは、(bar
上記のような) デフォルト値を持つフィールドがデフォルト値にリセットされます。
たとえば、
def get_rows():
rows = T.select()
return list(repr(r) for r in rows)
繰り返しますが、最初に正しいデータを取得し、その後、一部またはすべての行の値がデフォルトに置き換えられていることがわかりました。最終的に、すべての行がデフォルトにリセットされます。デフォルト値のないフィールドは変更されません。
クラス定義で設定する行をコメントアウトすると、正常にlazyUpdate
動作します (おそらく、db への書き込みがさらに多くなります)。コメントアウトしても、呼び出しはsyncUpdate
失敗します。デフォルトを別の値 (-1 など) に変更しても失敗します。問題を解決しようとして、テーブルを削除して何度も再作成したため、スキーマ設定が残っているわけではありません。
FWIW、私は SQLObject 1.3.1、Python 2.7、および PostreSQL 9.1 を使用しています。