【问题标题】:Why is PostgreSQL complaining about syntax on this UPDATE statement?为什么 PostgreSQL 抱怨这个 UPDATE 语句的语法?
【发布时间】:2021-03-22 13:10:20
【问题描述】:

我有一个 Python 函数,它可以接受一个字典,并在 SQL 中更新一行的多个字段(给定一个主键)。

def sql_update(conn, table, data, pkeyname, pkeyval):
    query = f"UPDATE {table} SET " + ', '.join(
        "{}=?".format(k) for k in data.keys()) + f" WHERE {pkeyname}=?"

    conn.execute(query, list(data.values()) + [pkeyval])

我这样称呼它:

sqlite_update(CURSOR, 'students', {'last_name' : "gamgee"}, "student_id", "5")

以下生成的 SQL 语句报告了无效的语法:

UPDATE students SET last_name=? WHERE student_id=? ['gamgee', '5']

syntax error at or near "=?"

此语句在 SQLite 中运行良好,为什么 PostgreSQL 会抱怨?用我的数组中的语句替换它还不够聪明吗?如果没有,那我该如何实现呢?

【问题讨论】:

  • 你想让查询做什么?
  • 您没有指定您正在使用哪个驱动程序,但它可能使用“%s”而不是“?” ?
  • @GordonLinoff 我想要 ?最后用数组中的值填充(就地),很方便
  • @snakecharmerb 我正在使用 psycopg2,但是当我在我的 Navicat 查询编辑器中执行此语句时,它也不会执行
  • 我也没有在 sqlite3 中看到这个声明 UPDATE students SET last_name=? WHERE student_id=? ['gamgee', '5']sqlite3 使用什么驱动程序,您在哪里找到该语句?在psycopg2 的情况下,您需要使用%s 作为占位符(%(name)s 用于命名参数)。如需更多信息,请参阅Parameters

标签: python sql postgresql


【解决方案1】:

你在写吗:

UPDATE students
    SET last_name = ?
    WHERE student_id = ANY (ARRAY['gamgee', '5']);

Here 是一个 dbfiddle,说明语法有效。

【讨论】:

  • 该语句似乎也产生了语法错误
  • 您链接的 dbfiddle 中的语句与您的评论中的语句不同,这会在“WHERE”之前产生语法错误
  • @Fleckenator 。 . .第一个? 是一个值的参数占位符。如果你使用? 并且在 SQLite 中使用过参数,我想你知道如何处理。
  • 确实?是一个值的占位符,但是我不明白为什么PostgreSQL不接受它作为一个值的占位符
  • @Fleckenator 。 . .确实如此 (postgresql.org/docs/current/ecpg-commands.html)。您也可以使用命名参数。
猜你喜欢
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多