【发布时间】:2017-02-14 05:47:24
【问题描述】:
我正在尝试使用 python 脚本将一些数据存储在 MYSQL 数据库中,但出现以下错误。
mysql.connector.errors.ProgrammingError: Failed processing format-parameters;
Python 'ndarray' 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 + data2 + data3 + data4 + data5
data_array.append(data)
print 'data_array: ', data_array
cursor.execute(smeData, data_array)
或者如果我尝试像这样组合所有变量
data_array = []
for item in totfiles.items():
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:
cursor.executemany(smeData, (v,))
当我打印 netCDF 变量数据时,例如时间变量,它看起来像 这个
nc.variables['time'][:] # netCDF variable
我知道了
[1302614127 1302614137 1302614147 ..., 1302614627 1302614647 1302614657]
微秒看起来像
[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]]
但是如果我打印
for v in data:
print v
然后我只在列表中获得了第一个列表,而不是我认为是我的主要问题的其他列表。
[1302614127 1302614137 1302614147 ..., 1302614627 1302614647 1302614657]
如果我尝试执行 cursor.executemany(smeData, (v,)) 命令,它会给我这个错误
mysql.connector.errors.ProgrammingError: Not all parameters were used in
the SQL statement
我的 MYSQL 插入语法是 我的 MYSQL 语法是
"INSERT INTO `rob-tabl` (`time.val`,`time.microsec`,`temp.degrees`,
`humid.calc`,`pressure.calc`) VALUES (%s,%s,%s,%s,%s)"
就我而言,它是 numpy.float32。我在 MYSQL 中创建了 5 列,我必须将 netCDF 中的数据存储到 db 中。
我是编程新手,我正在学习。如果有人帮助我或给出一些提示,我该如何处理这样的错误。我将非常感谢。
非常感谢。
【问题讨论】:
-
人们通常将数组编码为字符串(例如使用
pickle、np.save),并将其作为BLOB保存到数据库中。但看起来您正在尝试将数组保存为数字字段列。您是否尝试过arr.tolist()将一维数组转换为简单列表? -
给出一个MYSQL字段定义示例。
-
@hpaulj 非常感谢您的帮助,我将添加一个 MYSQL 字段示例,很快就会回来。是的,我正在尝试将 5 个字段写入数据库。我会用更多细节更新我的问题。
-
@hpaulj hpaulj 我在打印时添加了 MYSQL 数据库的列名以及变量的数据。我尝试了 tolist 方法,希望它可以解决我的问题,但我认为我没有正确使用它,这就是为什么我得到这个新错误。
-
我的回答,尤其是最后一个数据构建适合您的编辑。制作列表列表,并以 (?,?...) 格式插入并使用
executemany。
标签: python mysql numpy netcdf4