我正在使用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与反斜杠一起逃脱,但还没有找到正确的组合。想法?
答案 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),))