首页 > 解决方案 > 将行数据从csv导入postgresql时不能使用字符串

问题描述

作为练习的一部分,我必须每秒从 csv 中插入一行到我的 postgres 数据库中。只要我的行都不包含字符串,一切正常。我想知道如何在将变量添加到我的 INSERT 语句时只让我的字符串有 ' ' 。

with open(file_path, newline='') as csvfile:
  reader = csv.reader(csvfile)
  next(csvfile)
  for row in reader:
    print(row)
    cursor.execute("INSERT INTO %s (%s) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" % (tbl_name, cols, row[0], row[1], row[2], row[3], row[4],row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[15]))
    time.sleep(1)

提前致谢

标签: pythonpostgresqlcsv

解决方案


您永远不应该构建包含值作为完整字符串 (*) 的查询,而是使用参数化查询

cursor.execute("INSERT INTO %s (%s) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
    % (tbl_name, cols), row[:15]))

但是有些引擎不喜欢?,在这种情况下,你可以使用%s

cursor.execute("INSERT INTO %s (%s) VALUES (%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s,%%s)"
    % (tbl_name, cols), row[:15]))

这种模式已被弃用多年,因为它是SQL 注入攻击的原因......


推荐阅读