2016-09-22 66 views
3

我有一張表。這是創建聲明。將NULL值插入到雙數據類型MySQL Python

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行是第一個列表中它並沒有給出來的一樣截斷誤差第一個列表上?

+0

我很確定這是我正在執行的查詢。它也奇怪,0值插入該列。 – essramos

+0

實際上任何一種方法(準備與否)都會給我在數據庫上的相同結果,所以讓我們使用最新的(未準備好的)。 – essramos

回答

3

這並不完全是令人驚訝的。首先插入python預定義常量None

types.NoneType的唯一值。沒有經常用來代表 沒有值,因爲默認參數未傳遞給 函數。

這相當於SQL NULL。在第二種情況下,您將一個名爲'None'的字符串插入表中。這兩個是非常不同的。如果您將字符串插入到雙精度字段或浮點字段中,您會看到各種錯誤,通常是您看到的精確錯誤。

一審

它的作品,因爲你已經聲明:

`float8value` double DEFAULT NULL, 

此接受空,並且未在您的值列表中的第8位。當使用許多不同的參數時,使用命名參數總是一個好主意,以便一目瞭然地明確每列的約束條件。

更新:

運行代碼後,可達成的唯一結論是,你發現了一個bug,通過使用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') 

這不會產生錯誤,但是如果您擦除第一組值,則確實會產生錯誤。我的建議是提交一個錯誤報告

+0

我意識到這一點,問題是如何插入第一個列表而沒有任何錯誤?爲什麼它沒有在第二行上找到「無」的值? – essramos

+0

好吧,第一個vallist - >那些值被接受了。桌上已插入兩行。 – essramos

+0

即時通訊很確定這是查詢,我只有4行代碼。其中包括列表和查詢。 – essramos