如何在Web2py中为外键添加NOT NULL约束
我在使用Web2py时遇到了一个问题,就是我的模型生成的外键总是被设置为可以为空。我试过了我知道的所有方法,也在网上找了很多资料,但还是没解决。这里有一个简单的例子:
db = DAL('sqlite://storage.db')
users=db.define_table('user', Field('name') )
cars=db.define_table('cars', Field('user', users, notnull=True), Field('Model') )
print db._lastsql
This print ===
CREATE TABLE cars(
id INTEGER PRIMARY KEY AUTOINCREMENT,
user INTEGER REFERENCES users(id) ON DELETE CASCADE,
Model CHAR(512)
);
=============
看起来Web2py出于某种原因忽略了notnull=True这个设置。
我还尝试了一些变通的方法,比如设置默认值为'',但也没有用。这里还有一个使用MySQL作为后台的例子:
db = DAL('mysql://test:test@localhost:3306/test')
db.define_table('property',
Field('type', notnull=True),
Field('area','integer', notnull=True),
Field('rooms','integer', default = 0, notnull=True))
db.define_table('media',
Field('title', length = 30),
Field('file', 'upload', autodelete=True, notnull=True),
Field('prop_id', db.property, notnull=True, default='', required=True))
CREATE TABLE SQL:
CREATE TABLE `propdb`.`media` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(30) DEFAULT NULL,
`file` varchar(512) NOT NULL,
`prop_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `prop_id__idx` (`prop_id`),
CONSTRAINT `prop_media_ibfk_1` FOREIGN KEY (`prop_id`) REFERENCES `prop_property` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
在MySQL中,它不仅忽略了notnull,还把这一列设置成了'DEFAULT NULL',你可以看到'prop_id'这一列的情况。有没有人知道怎么让Web2py为外键添加'NOT NULL'呢?
注意:如果去掉default=''也没有什么区别。我是根据@simplyharsh的建议和这里的讨论加上的 http://www.mail-archive.com/web2py@googlegroups.com/msg12879.html
3 个回答
0
在web2py的DAL中,notnull=True的意思是:
这个字段的内容永远不能是'null'
(也就是假),这意味着如果你查询字符串类型的列,它会返回一个空字符串;而对于整数或浮点数类型的列,它会返回0
,而不是NULL(在DAL中表示为None或假)。
为了强制web2py的用户必须输入一个值,你需要定义这个字段的required小部件。例如:
db.tablefoo.fieldbar.requires = IS_IN_SET('OK', 'NOT OK')
0
我假设你不希望外键是空的,因为它应该对应于已经存在的某个东西。你有没有尝试过类似下面的做法呢?
db.property.area.requires=IS_IN_SET([Insert your list/array of possibilities])
1
当你设置了 notnull=True
时,最好也要设置一个默认值。
可以参考这个 讨论帖。