Как добавить ограничение NOT NULL для внешних ключей в Web2py

У меня возникли проблемы с тем, чтобы мои модели генерировали внешние ключи как ненулевые в 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 добавить «НЕ NULL» для внешних ключей?

Примечание. Если значение default='' удалено, ничего не изменится. Я добавил его в соответствии с предложениями @simplyharsh и обсуждением здесь http://www.mail-archive.com/[email protected]/msg12879.html


person harry    schedule 06.08.2010    source источник
comment
Кстати некоторые обновления. Я отказался от использования web2py для своего проекта. Сначала это звучало очень просто, но становилось все труднее изменить магическую логику web2py. Теперь вернемся к джанго.   -  person harry    schedule 23.09.2010
comment
Я думаю, что ORM web2py намного лучше и проще, чем ORM django. Я мог выполнять довольно сложные запросы с помощью ORM web2py. Я мог бы написать (id == 1) && (name == 'test'). В django я в основном прибегаю к простым операторам SQL даже для умеренно сложных запросов.   -  person harry    schedule 23.09.2010
comment
Для этого есть проблема в системе отслеживания проблем web2py: code.google. com/p/web2py/issues/detail?id=1395 (не знаю, почему это не исправлено)   -  person User    schedule 14.02.2014


Ответы (3)


Когда установлено notnull=True, вы также должны установить атрибут по умолчанию.

Обратите внимание на эту тему.

person simplyharsh    schedule 06.08.2010
comment
Спасибо! Я пробовал это, установив default='', но это не сработало. Это не повлияло на оператор создания таблицы. Также протестировал его с серверной частью MySQL и обнаружил такое же поведение. - person harry; 06.08.2010

Я предполагаю, что вы не хотите, чтобы внешний ключ был нулевым, потому что он должен соответствовать чему-то, что уже существует. Вы пробовали что-то вроде

db.property.area.requires=IS_IN_SET([Insert your list/array of possibilities])
person blastthisinferno    schedule 13.08.2010

notnull=True в контексте web2pys DAL означает:

Содержимое этого поля никогда не может быть 'null' (ложь), следствием этого является то, что выбор для строковых столбцов будет возвращать пустую строку, целочисленные или плавающие столбцы будут возвращать значение 0 вместо NULL (DAL: None или false).

Чтобы заставить пользователя web2py вставить значение, вам нужно определить обязательный виджет поля. Например:

db.tablefoo.fieldbar.requires = IS_IN_SET('OK', 'NOT OK')
person kkappel    schedule 11.11.2013