用tb.box =
替换box =
会将错误转移到".":
query = (f'UPDATE tb '
f"SET box = '{box_update}' "
f'FROM {table} tb '
'INNER JOIN question qu ON qu.id = tb.question_id '
f'WHERE qu.number_a = {num_a} AND qu.number_b = {num_b};')
错误:
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "FROM": syntax error [SQL: "UPDATE tb SET box = '0' FROM addition tb INNER JOIN question qu ON qu.id = tb.question_id WHERE qu.number_a = 1 AND qu.number_b = 9;"]
即使使用最新的SQLite来支持UPDATE-FROM,实际实现也可能无法完全遵守。具体来说,文档中没有注明:
UPDATE
支持外部查询中的JOIN
FROM
表不应重复UPDATE
中的表UPDATE
中可能不允许单独使用表别名。可能不应使用更新表的别名
考虑以下调整与文档中的示例对齐。下面演示了使用sqlite3
原始光标进行参数化。调整为使用sqlalchemy运行的方式。
q = f'''UPDATE {table}
SET box = ?
FROM question qu
WHERE qu.id = {table}.question_id
AND qu.number_a = ?
AND qu.number_b = ?;
'''
cursor.execute(q, (box_update, num_a, num_b))
conn.commit()
您使用的更新语法似乎根本不受支持,或者至少在您的SQLite版本上不受支持。然而,您可以重写更新以使用现有逻辑:
query = (f'UPDATE {table} tb '
f"SET box = '{box_update}' "
f'WHERE EXISTS (SELECT 1 FROM question qu '
f' WHERE qu.id = tb.question_id AND '
f' qu.number_a = {num_a} AND qu.number_b = {num_b});')
原始SQL查询看起来像这样:
UPDATE yourTable tb
SET box = ?
WHERE EXISTS (SELECT 1 FROM question qu
WHERE qu.id = tb.question_id AND
qu.number_a = ? AND qu.number_b = ?);