SQL 更新语句:接近 "FROM" 的操作错误



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 = ?);

相关内容

最新更新