I am trying to do a batch insert using psycopg2 into a postgres database. I am using %s and a list of tuples, but it's failing with the following error:
File ".../python3.6/site-packages/psycopg2/extras.py", line 1183, in execute_batch
sqls = [cur.mogrify(sql, args) for args in page]
File ".../python3.6/site-packages/psycopg2/extras.py", line 1183, in <listcomp>
sqls = [cur.mogrify(sql, args) for args in page]
TypeError: not all arguments converted during string formatting
Here's my code:
import psycopg2
import psycopg2.extras
conn = psycopg2.connect(
database='mydb',
user='name',
password='pass')
cur = conn.cursor()
query = "INSERT INTO my_table (tweet_id, user_id, time, text,
reply_to_user_id, reply_to_tweet_id, reply_to_handle, is_retweet,
is_quote, quote_usr_id, quote_usr_handle, quote_id, quote_text,
retweet_usr_id, retweet_usr_handle, retweet_id, longitude, latitude,
location, time_zone) VALUES (%s);"
#vals are values to insert, a list of tuples
vals = [(123, 123, datetime.datetime(2017, 1, 18, 17, 12, 33),
"'Some Text'", None, None, None, None, None, None, None, None,
None, 1234, "'username'", 1234, None, None, "'Somewhere'",
"'Pacific Time (US & Canada)'"),
(321, 321, datetime.datetime(2017, 1, 18, 15, 43, 19),
"'More text'", 321, 321, "'person'", None, None, None, None, None,
None, None, None, None, None,None, "'faraway'",
"'Pacific Time (US & Canada)'")]
psycopg2.extras.execute_batch(cur,query,vals)
I have also tried replacing the Nones with "NULL" strings to no avail.
vals is a list of tuples, so it isn't the common problem from the faq and various stackoverflow posts.
I'm hoping it's an issue with one of the types that I'm inserting, but am at a loss for which one. I've compared against the psycopg2 python to sql datatype conversion chart, and it seems like it should check out.