簡體   English   中英

TypeError:並非使用MySQL和Python在字符串格式化期間轉換所有參數

[英]TypeError: not all arguments converted during string formatting using MySQL and Python

我使用python腳本將文本文件導入mysql數據庫,但我得到一個奇怪的錯誤並通過互聯網搜索它但無法找到確切的解決方案。 我想創建列,一些列將以十進制數字存儲數據,如下所示

Alarmdata    fuAlarm
-1585.4       -35.3
-343.32       -54.3

我收到以下錯誤

_mysql_exceptions.ProgrammingError: (1064, "You have an error in your
SQL syntax; check the manual that corresponds to your MySQL server
version for the right syntax to use near '                 Alarmdata,
fuel_in_l DECIMAL(5,2), fuAlarm DECIMAL(4,3),        ' at line 1")

我通過將數據類型提供給空白數據解決了這個問題,但現在我遇到了這個錯誤。

TypeError: not all arguments converted during string formatting

我的代碼如下

import os
import sys
import csv
import MySQLdb as mdb

con = mdb.connect('localhost' , 'root' , 'kami' , 'tempdat')

cursor = con.cursor()
cursor.execute('CREATE TABLE Datatmp (id INT NOT NULL PRIMARY KEY     AUTO_INCREMENT, \
            timestamp INT(12), pomode INT(3), modeAlarm INT(3), \
            temperature_C DECIMAL(2,1), temperatureAlarm INT(3), \
            switch INT(3), Powerswitch INT(3), SIM_dollar INT , \
            Alarmdata INT, fuel_in_l DECIMAL(5,2), fuAlarm DECIMAL(4,3), \
            next_maint DECIMAL(5,2), next_maintenanceAlarm INT(2) )');

con.commit()             

file = open('//home/mysql/kami.txt', 'rb')
creader = csv.reader(txtfile.readlines()[3:], delimiter='\t')

for t in creader:
    cursor.execute('INSERT INTO Datatmp(timestamp, pomode, modeAlarm,\
                    temperature_C, temperatureAlarm, \
                    switch, Powerswitch, SIM_dollar, \
                    Alarmdata, fuel_in_l, fuAlarm \   
                    next_maint,  next_maintenanceAlarm)\
                    Values(%s,%s,%s,%s,%s,%s,NULL,NULL,%s,%s,%s,\
                    %s,%s,%s,%s,%s,%s)', t) 

file.close()
con.commit()
con.close()

類型錯誤意味着我沒有傳遞足夠的%s,但我傳遞了相同的數字,它不應該顯示此錯誤。 我也是MySQL和python的新手,所以我沒有解決。

在MySQL中,INT數據類型的值范圍為-21474836482147483647 所以你可以簡單地把數據類型INT放在那里。 休息一切都將由MySQL照顧。

(代表OP發布)

我解決了這個問題。 問題是如果我們將它們轉換為None類型,則Python會讀取空格。

import os
import sys
import csv
import MySQLdb as mdb


con = mdb.connect('localhost' , 'root' , 'kami' , 'tempdat')

cursor = con.cursor()
cursor.execute('CREATE TABLE Datatmp (timestamp INT(12), pomode INT(3), \
            modeAlarm INT(3), temperature_C DECIMAL(2,1),temperatureAlarm INT(3), \
            switch INT(3), Powerswitch INT(3),SIM_dollar INT(3), \
            Alarmdata INT(5),fuel_in_l DECIMAL(5,2), fuAlarm DECIMAL(4,3), \
            next_maint DECIMAL(5,2), next_maintenanceAlarm INT(2))');




con.commit()             

file = open('//home/mysql/kami.txt', 'rb')
creader = csv.reader(txtfile.readlines()[3:], delimiter='\t')



# now insert values in database
i = 0;

# read and store the values in database and also replace empty data 

for t in creader:
    print t
    for idx, v in enumerate(t):
        if v == ' ':
            t[idx] = None                   
    cursor.execute('INSERT INTO Data_121_RAPI_txt VALUES(%s,%s,%s,%s,%s,%s, \
                %s,%s,%s,%s,%s,%s, %s)', t)                
 i = i + 1



file.close()
con.commit()
con.close()

在這里,我面臨兩個問題。 1)如果有像Alarmdata這樣的空列,我仍然需要傳遞數據類型,這里我傳遞INT數據類型,因此可以很容易地刪除此錯誤。

 2)   TypeError: not all arguments converted during string formatting     

這里的問題是我在cursor.execute中傳遞了NULL並且它給出了錯誤,因此我創建了轉換每個空白空間並寫入None的代碼。 在palceholder中我沒有提供NULL,只是普通的掌上電腦,並且還提供了正確數量的占位符,問題就解決了。

我希望它能幫到人們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM