Postgres / psycopg2 - 插入字符串数组

时间:2011-07-28 01:22:32

标签: 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)

抛出异常:

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

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

4 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:3)

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))

答案 2 :(得分:0)

如果要通过SQL将数组插入到postgreSQL数据库中,可以这样做:

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

注意:您需要单引号括起大括号!所以实际上你将一个特殊“数组”语法的String / Varchar传递给DB

如果我将代码输入到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“array-grammar”格式化String,要么使用为您执行此操作的库。

答案 3 :(得分:-2)

如果要将整个元数据作为字符串转储到表中,您可以这样做:

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