psycopg2 cursor.execute没有绑定参数

时间:2016-05-03 22:45:37

标签: python postgresql string-formatting psycopg2

这是我的代码:

    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()调用的第二个参数的元素替换。为什么?打印行时,它包含我期望的值。

2 个答案:

答案 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元组成为参数本身。