2015-06-21 45 views
0

我正在使用sqlite3數據庫(測試花數據庫:))的web2py(python))。下面是表的聲明:其轉化爲正確的SQL中sql.log數據庫字段長度未強制執行

db.define_table('flower', 
     Field('code', type='string', length=4, required=True, unique=True), 
     Field('name', type='string', length=100, required=True), 
     Field('description', type='string', length=250, required=False), 
     Field('price', type='float', required=True), 
     Field('photo', 'upload')); 

CREATE TABLE flower(
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    code CHAR(4), 
    name CHAR(200), 
    description CHAR(250), 
    price CHAR(5), 
    photo CHAR(512) 
); 

但是當我插入的「代碼」字段,其大於4個字符的值,它仍插入。我嘗試設置爲CHAR(10)(簡單測試,我猜)具有相同的結果。

>>>db.flower.insert(code="123456789999", name="flower2", description="test flower 2", price="5.00"); 
>>>1L; 

同樣的問題適用於我設置長度的所有字段。我也嘗試過驗證(雖然我不是100%正確使用它)。這也是花模型flowers.py內表的定義在哪裏以及如下表聲明:本

db.flower.code.requires = [ IS_NOT_EMPTY(), IS_LENGTH(4), IS_NOT_IN_DB(db, 'flower.code')] 

文檔爲here,但我無法找到任何的限制條件的SQLite3或字符串的長度web2py的檢查。我希望在插入時看到一個錯誤。

希望對此有所幫助嗎?我在文檔中錯過了什麼?之前我在symphony2中使用了PHP和MySQL,並且期望類似的行爲。

回答

0

SQLite不像其他數據庫。對於所有(大多數)實際用途,列都是無類型的,並且INSERT總是成功並且不會丟失數據或精度(也就是說,如果需要,可以將文本值插入REAL字段中)。

該列的聲明類型用於稱爲「類型親和性」的系統,此處描述如下:https://www.sqlite.org/datatype3.html

一旦你習慣了它,這很有趣 - 但絕對不是你期望的!

在發佈INSERT之前,您必須在代碼中執行長度檢查。

+0

謝謝Larry。就像我在安東尼的回答下所說:太糟糕了,我不能「接受」兩者。我會寫一些預插入檢查來執行這個長度。太好了! –

0

如前所述,SQLite不執行字符字段長度聲明(請參閱https://www.sqlite.org/faq.html#q9)。此外,IS_LENGTH驗證程序僅適用於通過SQLFORM提交或通過.validate_and_insert方法進行插入 - 如果您只使用.insert方法,則不會應用存儲在requires屬性中的驗證程序,因此不會出現錯誤。

+0

謝謝安東尼。太糟糕了,我不能讓兩個答案「接受」,因爲它們很好地相互補充。這是有道理的,並感謝您的sqlite faq參考。 –