【问题标题】:Inserting rows into db from a list of tuples using cursor.mogrify gives error使用 cursor.mogrify 将行从元组列表中插入 db 会出错
【发布时间】:2017-06-19 08:31:53
【问题描述】:

我正在尝试使用 cursor.mogrify 使用 psycopg2: insert multiple rows with one query 将大量行插入到 postgres 中

data 是一个元组列表,其中每个元组是需要插入的一行。

 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) , 然后执行查询给出插入字节的错误....

我做错了吗?

【问题讨论】:

  • 插入大量行可能对使用复制有用。
  • @RomanTkachuk 同意你的观点,COPY 比这快很多倍。但有时写入文件不是一种选择,即使有时将文件复制到服务器也不是。
  • 您可以从标准输入复制。无需写入文件。

标签: python postgresql psycopg2


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    您可以这样做,但要验证 dict 值以防止 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"
    

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 2017-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多