2015-06-21 44 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参考。 –