使用 cursor.mogrify 从元组列表中将行插入数据库会出错
Inserting rows into db from a list of tuples using cursor.mogrify gives error
我正在尝试使用 cursor.mogrify 使用此 psycopg2: insert multiple rows with one query
将大量行插入 postgres
数据是一个元组列表,每个元组是需要插入的一行。
cursor = conn.cursor()
args_str = ','.join(cursor.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in data)
cursor.execute(
"insert into table1 (n, p, r, c, date, p1, a, id) values " + args_str)`
但出现错误:
TypeError: sequence item 0: expected str instance, bytes found
行:
args_str = ','.join(cursor.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in data)
如果我尝试更改为 b''.join(cursor.mogrify("(%s,%s,%s,%s,%s,%s,%s ,%s)", x) for x in data) ,
然后执行查询给出插入字节的错误....
我是不是做错了什么?
您可以这样做,但要验证字典值以防止 sql 注入。
>>> from psycopg2.extensions import AsIs
>>> _insert_sql = 'INSERT INTO myTable (%s) VALUES %s RETURNING id'
>>> data = {"col_1": "val1", "col_2": "val2"}
>>> values = (AsIs(','.join(data.keys())), tuple(data.values()))
>>> print(cur.mogrify(_insert_sql, values))
b"INSERT INTO myTable (col_1,col_2) VALUES ('val1', 'val2') RETURNING id"
data = [(1,2),(3,4)]
args_str = ','.join(['%s'] * len(data))
sql = "insert into t (a, b) values {}".format(args_str)
print (cursor.mogrify(sql, data).decode('utf8'))
#cursor.execute(sql, data)
输出:
insert into t (a, b) values (1, 2),(3, 4)
我正在尝试使用 cursor.mogrify 使用此 psycopg2: insert multiple rows with one query
将大量行插入 postgres数据是一个元组列表,每个元组是需要插入的一行。
cursor = conn.cursor()
args_str = ','.join(cursor.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in data)
cursor.execute(
"insert into table1 (n, p, r, c, date, p1, a, id) values " + args_str)`
但出现错误:
TypeError: sequence item 0: expected str instance, bytes found
行:
args_str = ','.join(cursor.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in data)
如果我尝试更改为 b''.join(cursor.mogrify("(%s,%s,%s,%s,%s,%s,%s ,%s)", x) for x in data) , 然后执行查询给出插入字节的错误....
我是不是做错了什么?
您可以这样做,但要验证字典值以防止 sql 注入。
>>> from psycopg2.extensions import AsIs
>>> _insert_sql = 'INSERT INTO myTable (%s) VALUES %s RETURNING id'
>>> data = {"col_1": "val1", "col_2": "val2"}
>>> values = (AsIs(','.join(data.keys())), tuple(data.values()))
>>> print(cur.mogrify(_insert_sql, values))
b"INSERT INTO myTable (col_1,col_2) VALUES ('val1', 'val2') RETURNING id"
data = [(1,2),(3,4)]
args_str = ','.join(['%s'] * len(data))
sql = "insert into t (a, b) values {}".format(args_str)
print (cursor.mogrify(sql, data).decode('utf8'))
#cursor.execute(sql, data)
输出:
insert into t (a, b) values (1, 2),(3, 4)