【问题标题】:mysql.connector.errors.ProgrammingError: Failed processing format-parameters;Python 'list' cannot be converted to a MySQL typemysql.connector.errors.ProgrammingError:处理格式参数失败;Python 'list' 无法转换为 MySQL 类型
【发布时间】:2017-07-01 23:12:54
【问题描述】:

我正在尝试使用 python 脚本将一些数据存储在 MYSQL 数据库中,但出现以下错误。

mysql.connector.errors.ProgrammingError: Failed processing format-parameters; 
Python 'list' cannot be converted to a MySQL type

实际上,我正在从 netCDF 文件中提取变量并尝试将它们存储在 MYSQL 数据库中。我的代码是

import sys
import collections
import os
import netCDF4
import calendar
from netCDF4 import Dataset
import mysql.connector
from mysql.connector import errorcode

table = 'rob-tabl'
con = mysql.connector.connect(user='rob', password='xxxx',
                                  database=roby)
cursor = con.cursor()


smeData = """
        CREATE TABLE rob-tabl (
        `id` bigint(20) NOT NULL AUTO_INCREMENT PRIMARY KEY,
        `time.val` double,
        `time.microsec` double,
        `temp.degrees` double,
        `humid.calc` double,
        `pressure.calc` double;"""

这些是我在 mMYSQL 数据库中的字段/列名称。我正在尝试将 netCDF4 数据插入 MYSQL

smeData = "INSERT INTO `" + table + "` "
.
.
.
.
.
.
.
.
data_array = []
for item in totfiles.items(): # loop on different netCDF files in a
                               directory , but at the moment I had only one file
    nc = Dataset('filename', 'r')
    data1 = nc.variables['time'][:]
    data2 = nc.variables['microsec'][:]
    data3 = nc.variables['temperature'][:]
    data4 = nc.variables['humidity'][:]
    data5 = nc.variables['pressure'][:] 
    data = ([(data1).tolist(), (data2).tolist(), data3.tolist(), data4.tolist(), data5.tolist()])
    data_array.append(data)
    print type(data)
    for v in data_array:
        cursor.executemany(smeData, (v,))

当我打印 netCDF 变量数据时,例如时间变量,它看起来像 这个

nc.variables['time'][:] # netCDF variable

所以data1看起来像这样

[1302614127 1302614137 1302614147 ............., 1302614627 1302614647 1302614657]

和 data2 的微秒看起来像

 [0 0 0..................., 0 0 0]

data_array 看起来像这样,因为它由五个不同的列表组成。

data_array=  ([1302614127 1302614137 1302614147 ..., 1302614627 1302614647
 1302614657], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [21, 22,34,34....,67,55], [12.2, 12.54, 12.55....,45.54,45.48], [0,0,0...,0,0,00])

如果我尝试执行 cursor.executemany(smeData, (v,)) 命令,它会给我这个错误

Python 'list' cannot be converted to a MySQL type

我的MYSQL插入语法是

"INSERT INTO `rob-tabl` (`time.val`,`time.microsec`,`temp.degrees`,
`humid.calc`,`pressure.calc`) VALUES (%s,%s,%s,%s,%s)"

我在 MYSQL 中创建了 5 列,我必须将 netCDF 中的数据存储到 db 中。
如果有人帮助我或给出一些提示,我该如何处理这样的错误。这会很棒。谢谢

【问题讨论】:

  • @Ike Walker,感谢编辑。
  • 每个子列表的长度是多少?使用 insert 命令,它应该是 5,每个 %s 一个值。
  • @hpaulj 我在我的问题中提到并显示子列表打印。有五个列表,我相应地使用 5 %s。 .但是如果我想看len。例如 print len(data1),结果为 2000,因为我在每个列表中有 2000 个值。

标签: python mysql numpy netcdf4


【解决方案1】:

虽然从我看到的情况来看我从未使用过它:

smeData = "INSERT INTO `rob-tabl` (`time.val`,`time.microsec`,`temp.degrees`, `humid.calc`,`pressure.calc`) VALUES (%s,%s,%s,%s,%s)"
cursor.executemany(smeData, data_array)

没有 for 循环。

【讨论】:

  • 据我所知,data_array 必须是 [(),(),()] 类型。包含元组值的列表。您有一个包含列表值的列表。也许这就是问题所在。将内部列表转换为元组,然后再试一次(使用我写的或喜欢的 smeData)。顺便说一句,data_array 必须包含这些值,这意味着每个元组有 5 个值。如果它有更多,这将不起作用
  • 你能给我举个例子吗?我在我的问题中提到实际上每个子列表都包含近 2000 个值。我怎样才能将它们转换为元组,然后是一组 5.thanx 的帮助。 .
  • 它与列表中的列表一起使用。我尝试使用类似于 mysql 的 pymysql。所以在 data = ([(data1).tolist(), (data2).tolist(), data3.tolist(), data4.tolist(), data5.tolist()]) 的 data1.tolist() 和其他是单一值还是什么?它们必须是单个值,因为稍后您将使用 data_array.append(data)。顺便说一句,如果您将数据设置为:data = (((data1).tolist(), (data2).tolist(), data3.tolist(), data4.tolist(), data5.tolist()) )
  • 我通过使用 zip 和转置来解决我的问题。像列表(zip(*数据))。 .但是非常感谢您的帮助和指导。
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 2012-10-12
  • 1970-01-01
  • 2021-10-04
  • 2023-03-29
  • 2017-08-22
  • 2019-12-09
  • 2023-02-14
相关资源
最近更新 更多