2

我无法让我的模型在 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 。

我还尝试了一些解决方法,例如给出 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

4

3 回答 3

1

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

考虑这个线程

于 2010-08-06T07:17:50.057 回答
0

我假设您不希望外键为空,因为它应该对应于已经存在的东西。你有没有尝试过类似的东西

db.property.area.requires=IS_IN_SET([Insert your list/array of possibilities])
于 2010-08-13T14:28:27.357 回答
0

notnull=True 在 web2pys DAL 的上下文中意味着:

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

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

db.tablefoo.fieldbar.requires = IS_IN_SET('OK', 'NOT OK')
于 2013-11-11T15:30:31.487 回答