将NULL值插入到双精度数据类型MySQL Python中

时间:2016-09-22 03:37:36

标签: 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;

这是我的插入声明:

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()

所以我尝试插入这些值。

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']

这是插入的。 DB的结果 enter image description here 但是当列表值是这个时(差异是首先评估字符串'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]

它给出了截断的错误。

Data truncated for column 'float8value' at row 2 

如果包含None的行是列表中的第一行,它在第一个列表中没有给出相同的截断错误?

1 个答案:

答案 0 :(得分:4)

这并不完全令人惊讶。在第一个实例中,您将插入python预定义常量None

  

types.NoneType的唯一值。没有经常用来表示   没有值,因为默认参数没有传递给a   功能

这相当于SQL NULL。在第二个实例中,您将在表中插入名为“None”的字符串。这两者非常不同。如果将字符串插入double或float字段,您将看到各种错误,通常是您看到的错误。

在第一个实例中它起作用,因为你声明了:

 `float8value` double DEFAULT NULL,

这接受NULL并且None位于值列表的第8位。当使用大量不同的参数时,使用命名参数总是一个好主意,这样一眼就可以看出每个列的绑定是什么。

更新

运行代码之后,唯一可以达成的结论就是你发现了一个错误,通过使用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')

这不会产生错误,但如果删除第一组值,则确实会产生错误。我的建议是提交错误报告