【问题标题】:CSV to SQL through Python: passing multiple arguments通过 Python 将 CSV 转换为 SQL:传递多个参数
【发布时间】:2016-11-18 19:10:42
【问题描述】:

我是 python 初学者,我正在尝试解析 CSV 文件并将其内容添加到数据库中。

我当前的代码:

with open('fruit.csv', 'rb') as f:
reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE)
for row in reader:
    sql = "INSERT INTO fruit(ID,NAME,COLOUR,SIZE) VALUES(?, ?, ?, ?)"
    try:
        cursor.execute(sql, [ row[0], row[1], row[2], row[3] ] )
        db.commit()
        print('done')
    except csv.Error as e:
        print('error: ' + e)
        db.rollback()

我当前的错误:

Traceback (most recent call last):
  File "mysqltest.py", line 23, in <module>
    cursor.execute(sql, (row[0], row[1], row[2], row[3]))
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 187, in execute
    query = query % tuple([db.literal(item) for item in args])
TypeError: not all arguments converted during string formatting

我在 SE 上阅读了许多其他问题的答案,但我仍然不明白如何将一行中的多个值作为单独的值传递给 SQL 字符串。

不确定是否相关,但这是我要写入的表的结构:

TABLE FRUIT (
         ID int primary key NOT NULL,
          NAME CHAR(20) NOT NULL,
          COLOUR CHAR(20),
          SIZE CHAR(20))

如果有人能解释我做错了什么,我将不胜感激!

【问题讨论】:

  • 尝试在列表的末尾添加一个逗号。更多,尝试使用元组而不是列表列表:)
  • 我理解它的方式,离开 ?我可以稍后在 .execute() 调用中传递参数,而当我尝试 %s (不成功)时,我也试图按照你所说的传递参数。我只是按照您的建议尝试添加 .format 并调整了其余部分,但我收到了 ProgrammingError 并被告知要在 (?, ?, ?, ?) 附近阅读我的语法。
  • @Dex'ter 感谢您的回复。我想这就是你的意思? sql = "INSERT INTO fruit(ID,NAME,COLOUR,SIZE) VALUES(?, ?, ?, ?)" vals = (row[0], row[1], row[2], row[3]) cursor.execute(sql, vals)
  • @Dex'ter 抱歉,缺少一半的评论...这不起作用:/

标签: python mysql sql csv typeerror


【解决方案1】:

在大多数 Python API 模块中,MySQL 使用 %s 运算符而不是 ?

sql = "INSERT INTO fruit(ID, NAME, COLOUR, SIZE) VALUES(%s, %s, %s, %s)"
try:
    cursor.execute(sql, [row[0], row[1], row[2], row[3]])

【讨论】:

  • 谢谢,我在其他问题中找到了这个语法,但我得到了这个结果:Traceback (most recent call last): File "mysqltest.py", line 23, in &lt;module&gt; cursor.execute(sql, [ row[0], row[1], row[2], row[3] ]) File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 205, in execute self.errorhandler(self, exc, value) File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler raise errorclass, errorvalue _mysql_exceptions.OperationalError: (1366, "Incorrect integer value: 'ID' for column 'ID' at row 1")
  • 现在我看到了,我认为这是因为第一行实际上是标题,所以应该以不同的方式解析它。如果我跳过它,我会看看它是否有效。
  • 如果第一行是标题,请在 with(...) 语句之后添加 next(f) 以跳过它。另外,尝试投射到int()
  • 非常感谢!你能澄清一下我把next(f)放在哪里吗?对不起,我做不到这一点!
  • with()之后尝试下一行。
【解决方案2】:

我认为类型错误。 所以,你可以试试下面的代码。

使用 str() 函数

cursor.execute(sql, [ str(row[0]), str(row[1]), str(row[2]), str(row[3]) ] )

【讨论】:

  • 恐怕没有乐趣。我还尝试将 row[0] 保留原样,因为它是数据库中的 int。我认为我的语法是错误的,但我不知道怎么做。
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多