Postgres/psycopg2 - 插入字符串数组

26

我正在使用Postgres 9、Python 2.7.2和psycopg2,尝试插入一个带有正确转义引号的字符串值数组。示例:

metadata = {"Name": "Guest", "Details": "['One', 'Two', 'Three']"}

cur.execute("insert into meta values ('%s');" % metadata)

会抛出以下异常:

psycopg2.ProgrammingError: syntax error at or near "One"
LINE 1: "Details": "['One...
                      ^

我还尝试使用Postgres的E进行转义,加上反斜杠,但尚未找到正确的组合。有什么想法吗?


你在 "[\'One\', \'Two\', \'Three\']" 中遇到了什么错误? - agf
4个回答

35

2
啊,我错过了细微的格式更改。使用cur.execute(“insert into meta values%s”,metadata)对我有效。非常感谢。 - Growth Mindset
1
回答链接已失效,未来的搜索者可以在此处查看“链接适配”部分:https://www.psycopg.org/docs/usage.html。基本上,您需要这样传递Python列表:`cur.execute("SELECT * FROM data WHERE id = ANY(%s);", (yourList,))`。 - English Rain
1
对 @EnglishRain 的解决方案点赞。只需链接文档的确切部分:https://www.psycopg.org/docs/usage.html#adapt-list - Alexander Otavka
1
谢谢,链接已修复。 - piro
@EnglishRain的解决方案适用于列表。 - Marcos Santana

6

如果您想通过SQL将数组插入到postgreSQL数据库中,可以按照以下方式操作:

INSERT INTO tablename VALUES ('{value1,value2,value3}');

注意:您需要使用单引号将大括号括起来!因此,实际上您正在向数据库传递一个特殊的“数组”语法的字符串/varchar。

如果我将您的代码输入Python解析器,则会得到类似于以下内容:

'{'Name': 'Guest', 'Details': "['One', 'Two', 'Three']"}'

但是PostgreSQL希望得到这样的内容:
'{"Name","Guest","Details",{"One","Two","Three"}}'

请查看关于数组的手册:http://www.postgresql.org/docs/9.0/static/arrays.html

因此,您可以编写帮助函数按照PostgreSQL的“数组语法”格式化字符串,或者使用可以为您执行此操作的库。


1
def lst2pgarr(alist):
    return '{' + ','.join(alist) + '}'

pyarray = ['pippo', 'minni', 1, 2]

conn = psycopg2.connection (  HERE PUT YOUR CONNECTION STRING  )
c = conn.cursor()

c.execute('select ... where pgarray_attr = %r' % (lst2pgarr(pyarray))
c.execute('insert into tab(pgarray_attr) values (%r)' % (lst2pgarr(pyarray))

3
如果pyarray包含一个带有逗号的字符串,例如'ciao,mondo',该怎么办? - piro
这将是一个单一的对象(超出了主题)。5年后,我的方法已经改变了。我猜例如你应该声明逗号分隔符是否为第二维数组或扩展,然后递归拆分可以是快速修复。目前您的建议很好:https://www.psycopg.org/docs/usage.html#lists-adaptation, 现在我想使用json数据类型,并且当我不需要事务时,我使用postgRest.ogr。 - LittleEaster

-4
如果您要将整个元数据作为一个字符串转储到表中,只需执行以下操作:
cur.execute("insert into meta values (%s);", (str(metadata),))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接