心理2光标.执行不绑定参数

2024-09-11 00:43:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码是:

    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,则会产生以下结果:

^{pr2}$

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


Tags: 代码dfwithlineparamsopenconnits
2条回答

{来自^ a1:

对于位置变量绑定,第二个参数必须始终是序列,即使它包含单个变量。请记住,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

`

这可能是你把元组喂错了光标.执行()

你的代码应该有用。我不知道为什么没有。你说你修改了元组。按原样发布元组,而不是修订版。不管怎样,下面要简单得多。在

由于Psycopg将Python元组调整为Postgresql记录,因此将其作为单个参数传递:

cur.execute('INSERT INTO mstest values %s', (row,))

注意row后的逗号。它使row元组本身成为参数。在

相关问题 更多 >