这是我的代码:
with open(params['dataFile']) as df:
conn = psycopg2.connect(params['connStr'])
cur = conn.cursor()
its = 0
for line in df:
if its == 0:
pass
else:
row = tuple(line.replace('\n','').split(params['delimiter']))
try:
cur.execute(params['insQueryStr'],row)
except:
print(cur.mogrify(params['insQueryStr'],row))
print(row)
break
its += 1
conn.commit
conn.close
没有try / catch,就会产生这个:
psycopg2.ProgrammingError: syntax error at or near "%"
LINE 1: INSERT INTO mstest values (%s, %s, %s, %s, %s, %s, %s, %s, %...
使用try catch,对mogrify的调用打印出来:
b'INSERT INTO mstest values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);'
我的查询字符串中的'%s没有被cur.execute()调用的第二个参数的元素替换。为什么?打印行时,它包含我期望的值。
答案 0 :(得分:0)
来自http://initd.org/psycopg/docs/usage.html#query-parameters:
对于位置变量绑定,第二个参数必须始终是序列,即使它包含单个变量。请记住Python需要一个逗号来创建单个元素元组: `
cur.execute("INSERT INTO foo VALUES (%s)", "bar") # WRONG
cur.execute("INSERT INTO foo VALUES (%s)", ("bar")) # WRONG
cur.execute("INSERT INTO foo VALUES (%s)", ("bar",)) # correct
cur.execute("INSERT INTO foo VALUES (%s)", ["bar"]) # correct
`
将一个元组提供给cursor.execute()
可能是错误的答案 1 :(得分:0)
您的代码应该有效。我不知道为什么不这样做。你说你有点修改了元组。完全按照原样发布元组,而不是编辑版本。无论如何,以下内容要简单得多。
由于Psycopg将Python元组调整为Postgresql记录,因此将其作为单个参数传递:
cur.execute('INSERT INTO mstest values %s', (row,))
注意row
之后的逗号。它使row
元组成为参数本身。