使用 psycopg2 插入/更新记录时出现语法错误


record_insert = """ INSERT INTO geo_index   
(   link_id,
tile_id,
geo_index) VALUES (%s,%s,%s""" + ")" + 
"""ON CONFLICT (link_id, tile_id)
DO UPDATE
link_id = {},
tile_id = {},
geo_index = {} """.format(link, tile, geo_index)

编辑: 我的代码: record_insert = "" 插入 geo_index
( link_id, tile_id, geo_index( 值 (%s,%s,%s( 关于冲突(link_id,tile_id( 执行更新 link_id = {}, tile_id = {}, geo_index = {} "".format(link, tile, geo_index( 打印(record_insert( record_to_insert =(链接、磁贴、geo_index(

cur.execute(record_insert,record_to_insert)

你在这里有几个问题。最大的问题是你对SQL注入攻击持开放态度。永远,永远,永远不要通过将不受信任的字符串放入SQL代码来构造SQL查询。看:

  • https://owasp.org/www-community/attacks/SQL_Injection
  • https://en.wikipedia.org/wiki/SQL_injection
  • https://xkcd.com/327/

若要避免 SQL 注入攻击,请使用正确的方法来构建 SQL 命令。对于 psycopg2,这意味着类似

cursor = conn.cursor()
cursor.execute("""
INSERT INTO geo_index ( link_id, tile_id, geo_index) VALUES (%s,%s,%s)
ON CONFLICT (link_id, tile_id)
DO UPDATE SET link_id = %s, tile_id = %s, geo_index = %s
""",
link, tile, geo_index, link, tile, geo_index)

有关文档,请参阅 https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries。

您的第二个问题是您正在尝试组合两种不同样式的字符串格式:%运算符与.format()%s%运算符一直在 Python 中,因此您将看到许多使用它们的现有代码和库。{..}.format()方法是较新的,因此没有被广泛使用。试图混合搭配真的行不通。

您的第三个问题是您尝试将 3 个值插入到一个需要 6 的字符串中。这是使用PostgreSQL的"冲突更新"功能的一个怪癖:您需要指定要插入的3个值,然后您需要再次指定它们,以防插入时发生冲突。

我故意不向您展示如何使用手动%.format()调用构造此字符串,因为任何一个都会给您带来SQL注入攻击。使用 psycopg2 格式化查询的方式,您就不会遇到这个问题。

最新更新