版本 5.4.57
库:
修复了使用 PostgreSQL、MSSQL 或 Firebird 数据库时的 记录锁定 错误
要为定义了 on_apply 事件处理器的项目使用记录锁定,您必须改为:添加连接参数,创建游标并使用游标执行 sql 查询。否则记录锁定将不起作用。
例如,代码
def on_apply(item, delta, params):
tracks_sql = []
delta.update_deleted()
for d in delta:
for t in d.invoice_table:
if t.rec_inserted():
sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) + \
%s WHERE ID = %s" % \
(t.quantity.value, t.track.value)
elif t.rec_deleted():
sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
(SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) WHERE ID = %s" % \
(t.id.value, t.track.value)
elif t.rec_modified():
sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
(SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) + %s WHERE ID = %s" % \
(t.id.value, t.quantity.value, t.track.value)
tracks_sql.append(sql)
sql = delta.apply_sql()
return item.task.execute(tracks_sql + [sql])
必须更改为
def on_apply(item, delta, params, connection):
with item.task.lock('invoice_saved'):
cursor = connection.cursor()
delta.update_deleted()
for d in delta:
for t in d.invoice_table:
if t.rec_inserted():
sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) + \
%s WHERE ID = %s" % \
(t.quantity.value, t.track.value)
elif t.rec_deleted():
sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
(SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) WHERE ID = %s" % \
(t.id.value, t.track.value)
elif t.rec_modified():
sql = "UPDATE DEMO_TRACKS SET TRACKS_SOLD = COALESCE(TRACKS_SOLD, 0) - \
(SELECT QUANTITY FROM DEMO_INVOICE_TABLE WHERE ID=%s) + %s WHERE ID = %s" % \
(t.id.value, t.quantity.value, t.track.value)
cursor.execute(sql)