【问题标题】:How to update postgres array on Python如何在 Python 上更新 postgres 数组
【发布时间】:2023-01-12 17:29:00
【问题描述】:

我在“用户”表中选择了列“user_list”并提取到一个名为“u_list”的 python 变量。我在其中附加了“项目”并尝试更新“user_list”,但出现了很多错误。我尝试在 stackoverflow 上搜索,但没有任何帮助。

代码:

cursor.execute(f'SELECT user_list FROM users WHERE id=442392434899681280')
u_list = cursor.fetchone()[0]
u_list.append('item')
cursor.execute('UPDATE users SET user_list = {} WHERE id = 442392434899681280'.format(u_list))
data_base.commit()

但出现错误:

Traceback (most recent call last):
  File "d:\workspace\sabo\test.py", line 30, in <module>
    cursor.execute('UPDATE users SET user_list = {} WHERE id = 442392434899681280'.format(u_list))
psycopg2.errors.SyntaxError: syntax error at or near "["
LINE 1: UPDATE users SET user_list = ['item'] WHERE id = 4423924348996...

另一个尝试和错误 代码:

cursor.execute(f'SELECT user_list FROM users WHERE id=442392434899681280')
u_list = cursor.fetchone()[0]
u_list.append('item')
cursor.execute("UPDATE users SET user_list= (%s) WHERE id = 442392434899681280", (u_list))
data_base.commit()

错误:

  File "d:\workspace\sabo\test.py", line 33, in <module>
    cursor.execute("UPDATE users SET user_list= (%s) WHERE id = 442392434899681280", (u_list))
psycopg2.errors.InvalidTextRepresentation: malformed array literal: "item"
LINE 1: UPDATE users SET user_list= ('item') WHERE id = 4423924348996...
                                    ^
DETAIL:  Array value must start with "{" or dimension information.

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    把它想象成你自己输入查询。正如错误声明所指定的那样,PostgreSQL arrays 必须以“{”开头,因此它们必须是在大括号内.如果您自己用 SQL 编写查询,它将如下所示:

    UPDATE users SET user_list = '{"foo", "bar", "item"}' WHERE id = 442392434899681280;
    

    所以在 Python 中,它必须像这样完成:

    cursor.execute(f'SELECT user_list FROM users WHERE id=442392434899681280')
    u_list = cursor.fetchone()[0]
    u_list.append('item')
    cursor.execute('UPDATE users SET user_list = '{{{}}}' WHERE id = 442392434899681280'.format(','.join(['"{}"'.format(v) for v in u_list])))
    data_base.commit()
    

    注意格式化中的三个花括号, two are to escape 所以一个 '{' 保留,第三个用于格式化。还,如果您的列表不是字符串,则必须在加入之前将其转换.

    Psycopg2's docs 还声明 Python 列表已转换为 PostgreSQL ARRAY 所以你在第二次试验中缺少的是这个(列表后面缺少逗号和 %s 周围的额外括号):

    cursor.execute("UPDATE users SET user_list= %s WHERE id = 442392434899681280", (u_list,))
    

    【讨论】:

    • psycopg2.errors.SyntaxError:“{”处或附近的语法错误 第 1 行:更新用户 SET user_list= {item} WHERE id = 442392434899681...
    • 抱歉,忘记了单引号,我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多