Postgres/psycopg2 - 插入字符串数组

Ian*_*Ian 12 python postgresql psycopg2

我正在使用Postgres 9和Python 2.7.2以及psycopg2,并尝试使用正确转义的引号插入字符串值数组.样品:

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

cur.execute("insert into meta values ('%s');" % metadata)
Run Code Online (Sandbox Code Playgroud)

抛出异常:

psycopg2.ProgrammingError: syntax error at or near "One"
LINE 1: "Details": "['One...
                      ^
Run Code Online (Sandbox Code Playgroud)

我也尝试使用Postgres'E与反斜杠一起逃脱,但还没有找到正确的组合.想法?

pir*_*iro 20

你必须让psycopg为你做参数绑定:不要试图自己引用它们.

Psycopg自动将python字符串列表转换为postgres数组.查看http://initd.org/psycopg/docs/usage.html

  • 啊,我错过了轻微的格式变化。使用 cur.execute(“插入元值 %s”, 元数据) 对我有用。非常感谢。 (2认同)

das*_*zul 6

当你想通过 SQL 将数组插入到 postgreSQL 数据库中时,你可以这样做:

INSERT INTO tablename VALUES ('{value1,value2,value3}');
Run Code Online (Sandbox Code Playgroud)

注意:您需要用单引号将花括号括起来!所以实际上你正在将特殊“数组”语法的 String/Varchar 传递给数据库

如果我将你的代码输入到 python 解析器中,我会得到如下内容:

'{'Name': 'Guest', 'Details': "['One', 'Two', 'Three']"}'
Run Code Online (Sandbox Code Playgroud)

但 PostgreSQL 期望的是这样的:

'{"Name","Guest","Details",{"One","Two","Three"}}'
Run Code Online (Sandbox Code Playgroud)

检查数组手册:http://www.postgresql.org/docs/9.0/static/arrays.html

因此,您可以根据 PostgreSQL“数组语法”通过编写辅助函数来格式化字符串,或者使用可以为您完成此操作的库。