Reputation: 1233
I'm using Postgres 9 and Python 2.7.2 along with psycopg2 and am trying to insert an array of string values with properly escaped quotation marks. Sample:
metadata = {"Name": "Guest", "Details": "['One', 'Two', 'Three']"}
cur.execute("insert into meta values ('%s');" % metadata)
which throws the exception:
psycopg2.ProgrammingError: syntax error at or near "One"
LINE 1: "Details": "['One...
^
I've also tried using Postgres' E to escape along with backslashes, but haven't found the correct combination yet. Ideas?
Upvotes: 28
Views: 55982
Reputation: 13931
You have to let psycopg do parameters binding for you: don't try to quote them yourself.
Psycopg automatically converts a python list of strings into a postgres array. Check https://www.psycopg.org/docs/usage.html#lists-adaptation
Upvotes: 36
Reputation: 601
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))
Upvotes: 1
Reputation: 6142
When you want to insert an array into a postgreSQL DB via SQL you do it like this:
INSERT INTO tablename VALUES ('{value1,value2,value3}');
ATTENTION: You need the single quotes to surround the curly braces! So actually you're passing a String/Varchar of a special "array" grammar to the DB
If I enter your code into a python parser I get something like this:
'{'Name': 'Guest', 'Details': "['One', 'Two', 'Three']"}'
But PostgreSQL expects something like this:
'{"Name","Guest","Details",{"One","Two","Three"}}'
Check the manual on Arrays: http://www.postgresql.org/docs/9.0/static/arrays.html
So either you format the String according to the PostgreSQL "array-grammar" by writing a helper function or you use a library which does that for you.
Upvotes: 6
Reputation: 6277
If you are going to dump the whole metadata as a string into the table, you can just do:
cur.execute("insert into meta values (%s);", (str(metadata),))
Upvotes: -4