如何在Web2py中的外键上添加NOT NULL约束

时间:2010-08-06 06:48:17

标签: python web2py

我无法让我的模型在Web2py中生成外键,因为它不是null。 我已经尝试了我所知道的所有内容以及我能在网上找到的所有内容。这是一个简单的例子:

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。

我也尝试了一些解决方法,例如给出default =''但没有帮助。 这是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 :(得分:1)

设置notnull=True时,您还应设置默认属性。

考虑这个thread

答案 1 :(得分:0)

我假设您不希望外键为null,因为它应该对应于已存在的内容。你有没有尝试过

的内容
db.property.area.requires=IS_IN_SET([Insert your list/array of possibilities])

答案 2 :(得分:0)

在web2pys DAL的上下文中

notnull = True表示:

此字段的内容永远不会是'null'(false), 结果是,为字符串列选择将返回空字符串,整数或浮点列将返回值0而不是NULL(DAL:无或false)。

要强制web2py用户插入值,您需要定义该字段的 required 小部件。例如:

db.tablefoo.fieldbar.requires = IS_IN_SET('OK', 'NOT OK')