2011-07-28 133 views
6

我正在使用Postgres 9和Python 2.7.2以及psycopg2,并试图插入带正确转义的引号的字符串值数组。示例:Postgres/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

你用'''''''',''''''''''''''得到了什么错误? – agf

回答

16

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

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

+0

啊我错过了轻微的格式改变。使用cur.execute(“插入元值%s”,元数据)为我工作。非常感谢你。 – Ian

0

如果你要放弃整个元数据作为一个字符串到表中,你可以做:

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

当你要插入一个数组通过SQL一个PostgreSQL数据库,你做这样的:

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

注意:你需要单引号包围的大括号!所以实际上你传递一个字符串/ 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的“数组语法格式字符串“通过编写一个帮助函数,或者使用一个库来为你做。

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