У меня возникли проблемы с тем, чтобы мои модели генерировали внешние ключи как ненулевые в 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