1

Pythonスクリプトを使用してMYSQLデータベースにデータを保存しようとしていますが、次のエラーが発生しました。

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

実際には、netCDF ファイルから変数を抽出し、それらを MYSQL db に保存しようとしています。私のコードは

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 にデータを格納する必要がありました。
私はプログラミングが初めてで、学んでいます。誰かが私を助けたり、ヒントを与えたりしたら、どうすればそのようなエラーに対処できますか。とても感謝しています。どうもありがとう。

4

1 に答える 1