【发布时间】:2026-02-03 19:50:01
【问题描述】:
我正在使用 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 的新手,所以我没有解决。
【问题讨论】:
-
在您的表定义中,您没有 Alarmdata 的数据类型
-
@Niagaradad 是的,我不知道在哪里。如果该列在表中但没有数据,则为空白。那么我应该显示什么数据类型? NULL 还是 INT?其次,如果我有像 -152.43 这样的值,我该如何分配这个数据类型? .如果有任何提示,我将非常感激。我花了一整天的时间。
-
OP - 添加了一个社区 wiki 作为对您最后陈述的回答,但没有意义。 Python 的 Nones 在 MySQL 中被翻译为 Nulls。此外,您的追加查询缺少逗号,并且为列出的字段传递了太多占位符。未来的读者可能会对您的发现感兴趣。请通过示例代码调整完全回答您自己的问题。
-
我用代码示例和正确答案提供我的答案。我希望它能帮助人们。