was*_*898 3 python mysql prepared-statement
我有桌子 这是create语句。
CREATE TABLE `runsettings` (
`runnumber` mediumint(9) NOT NULL,
`equipment` varchar(45) NOT NULL,
`wafer` varchar(45) NOT NULL,
`settingname` varchar(100) NOT NULL,
`float8value` double DEFAULT NULL,
`apcrunid` varchar(45) DEFAULT NULL,
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`intvalue` int(11) DEFAULT NULL,
`floatvalue` float DEFAULT NULL,
`Batch` varchar(45) DEFAULT NULL,
`IndexNum` smallint(6) DEFAULT '1',
`stringvalue` mediumtext,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1056989 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
这是我的插入语句:
import mysql.connector
cnx = mysql.connector.connect(user='test',
password ='test',host='0.0.0.1',
database='test')
vallist = [(471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, None),
(471285, u'CT19', 7, u'00000', u'Etch Time Min', None, None, 'None')]
cursor = cnx.cursor()
# ss =
cursor.executemany("INSERT INTO runsettings (apcrunid,equipment,runnumber,wafer,settingname,intvalue,floatvalue,float8value) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)",vallist)
cnx.commit()
Run Code Online (Sandbox Code Playgroud)
所以我尝试插入这些值。
vallist = [471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, None,
471285, u'CT19', 7, u'00000', u'Etch Time Min', None, None, 'None']
Run Code Online (Sandbox Code Playgroud)
这被插入。数据库结果
但是当列表值是这个值时(区别是'None'首先评估字符串):
vallist = [471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, 'None',
471285, u'CT19', 7, u'271042', u'Etch Time Min', None, None, None]
Run Code Online (Sandbox Code Playgroud)
它给出了截断的错误。
Data truncated for column 'float8value' at row 2
Run Code Online (Sandbox Code Playgroud)
当包含该行None的列表中的第一行没有在第一张列表中给出相同的截断错误时,怎么会这样呢?
这并不完全令人惊讶。在第一个实例中,您要插入python预定义常量None
types.NoneType的唯一值。当没有将默认参数传递给函数时,通常不使用None来表示缺少值。
这相当于SQL NULL。在第二个实例中,您将在表中插入一个名为“ None”的字符串。这两个是非常不同的。如果在双精度或浮点型字段中插入字符串,您将看到各种错误,大多数情况下是您所看到的确切错误。
在第一个实例中它有效,因为您已声明:
`float8value` double DEFAULT NULL,
Run Code Online (Sandbox Code Playgroud)
这接受NULL,并且None在值列表中排在第八位。当使用许多不同的参数时,使用命名参数始终是一个好主意,这样一眼便可以看出绑定到每列的内容。
更新:
运行代码后,唯一可以得出的结论是,您可以通过使用print(cursor.statement)发现执行的查询的方式找到了一个错误。
INSERT INTO runsettings (apcrunid,equipment,runnumber,wafer,settingname,intvalue,floatvalue,float8value)
VALUES (471285,'CT19',7,'271042','Etch Time Min',NULL,NULL,NULL),
(471285,'CT19',7,'00000','Etch Time Min',NULL,NULL,'None')
Run Code Online (Sandbox Code Playgroud)
这不会产生错误,但是如果擦除第一组值,则确实会产生错误。我的建议是提交错误报告
| 归档时间: |
|
| 查看次数: |
2739 次 |
| 最近记录: |