I want to have a non-null foreign key reference, e.g.

owner = db.define_table('owner'', Field('name'))
package = db.define_table('package', Field('owner_id', owner, 
notnull=True), Field('name'))

SQLite for example has no problem with this:

sqlite> create table owner(id int primary key, name text);
sqlite> create table package(id int primary key, owner_id references owner 
not null, name text);
sqlite> insert into owner values(1, "web2py");
sqlite> insert into package values(1, 1, "markmin");
sqlite> insert into package values(2, null, "hello");
Error: package.owner_id may not be NULL

However, web2py will not put a "not null" qualifier on the foreign key 
reference; there is a specific check to NOT add a "not null" if the field 
is an id field or it is a reference field. Why is that?

A bug in my app relating to this was just discovered by a user; I was 
relying on the database to signal an IntegrityError and fail to insert 
records that have a null reference, but they got in anyway.

validate_and_insert will actually catch this -- but, why doesn't web2py 
append the NOT NULL?

Reply via email to