About my 'Let's dance' -comment - there is already opened issue https://github.com/web2py/pydal/issues/314 (SQLite syntax error in case of reference to keyed table) I opened *one* <https://github.com/web2py/pydal/issues/336>yet about reference to FK-field
On Sunday, March 13, 2016 at 3:51:59 AM UTC+3, Anthony wrote: > > You can submit an issue to the pyDAL repo. > > On Saturday, March 12, 2016 at 6:03:10 PM UTC-5, Val K wrote: >> >> >> I've solved my problem - just additional condition >> in dal\pydal\adapters\base.py: >> >> 298. >> 299. >> 300. >> 301. >> 302. >> 303. >> >> 304. >> 305. >> 306. >> 307. >> >> >> # must be PK reference or unique >> if rfield.type[:10] != 'reference ' and rfield.type[:14] != >> 'big-reference ' and \ >> getattr(rtable, '_primarykey', None) and rfieldname in >> rtable._primarykey or \ >> rfield.unique: >> ftype = types[rfield.type[:9]] % \ >> dict(length=rfield.length) >> >> # multicolumn primary key reference? >> if not rfield.unique and len(rtable._primarykey)>1: >> # then it has to be a table level FK >> if rtablename not in TFK: >> >> >> works fine! >> >> >> >> >> On Sunday, March 13, 2016 at 12:17:06 AM UTC+3, Val K wrote: >>> >>> OK! Let's dance >>> >>> This doesn't work (with SQLite at least): >>> db.define_table('a_tbl', Field('id', 'integer'), Field('name'), >>> primarykey=['id'] ) # one keyed table >>> db.define_table('b_tbl', Field('id', 'reference a_tbl.id'), >>> Field('name'), primarykey=['id']) # another keyed table >>> >>> <class 'sqlite3.OperationalError'> near "name": syntax error >>> >>> >>> sql.log: >>> *CREATE TABLE b_tbl(* >>> * id INTEGER, CONSTRAINT "FK_b_tbl_id__constraint" FOREIGN KEY (id) >>> REFERENCES a_tbl (id) ON DELETE CASCADE,** name CHAR(512),** >>> PRIMARY KEY(id)) ;* >>> >>> >>> This doesn't work too: >>> db.define_table('a_tbl', Field('id', 'integer'), Field('name'), >>> primarykey=['id'] ) # one keyed table >>> db.define_table('b_tbl', Field('id', db.a_tbl), Field('name'), >>> primarykey=['id']) # another keyed table >>> it produces the same sql.log and causes the same error - expected >>> >>> >>> But this works!: >>> db.define_table('a_tbl', Field('id', 'id'), Field('name') ) # not keyed >>> table >>> db.define_table('b_tbl', Field('id', 'reference a_tbl'), Field('name'), >>> primarykey=['id']) # keyed table that references to not keyed table >>> >>> >>> it produces another sql.log: >>> CREATE TABLE b_tbl( >>> id INTEGER REFERENCES a_tbl (id) ON DELETE CASCADE NOT NULL , >>> name CHAR(512), >>> PRIMARY KEY(id)) ; >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> On Saturday, March 12, 2016 at 8:54:37 PM UTC+3, Anthony wrote: >>>> >>>> Not sure if it's a bug, but the book does say: >>>> >>>> - Keyed tables can only reference other keyed tables. >>>> - Referencing fields must use the reference tablename.fieldname >>>> format. >>>> >>>> Anthony >>>> >>>> On Saturday, March 12, 2016 at 4:52:53 AM UTC-5, Val K wrote: >>>>> >>>>> Hi! >>>>> I have a problem - look at example: >>>>> >>>>> db.define_table('a_tbl', Field('name')) >>>>> db.define_table('b_tbl', Field('id', 'reference a_tbl') >>>>> ,Field('name'), primarykey=['id']) >>>>> db.define_table('c_tbl', Field('b_tbl_id', 'reference b_tbl') >>>>> ,Field('name')) >>>>> >>>>> >>>>> *c_tbl* definition causes an error (see below) because there is >>>>> *b_tbl_id* field that references to *b_tbl* that has *id* reference >>>>> to *a_tbl* >>>>> >>>>> Is this a bug? >>>>> >>>>> >>>>> >>>>> >>>>> ---------------------------------------------------------------------------------------------------------- >>>>> >>>>> <type 'exceptions.KeyError'> 'foreign_key' >>>>> >>>>> web2py™Version 2.13.4-stable+timestamp.2015.12.26.04.59.39PythonPython >>>>> 2.7.9: >>>>> >>>>> >>>>> *File D:\web2py_last\web2py\gluon\packages\dal\pydal\adapters\base.py >>>>> in create_table at line 303* >>>>> Function argument list >>>>> >>>>> (self=<pydal.adapters.sqlite.SQLiteAdapter object>, table=<Table c_tbl >>>>> (id,name)>, migrate=True, fake_migrate=False, polymodel=None) >>>>> Code listing >>>>> >>>>> 298. >>>>> 299. >>>>> 300. >>>>> 301. >>>>> 302. >>>>> 303. >>>>> >>>>> 304. >>>>> 305. >>>>> 306. >>>>> 307. >>>>> >>>>> >>>>> # must be PK reference or unique >>>>> if getattr(rtable, '_primarykey', None) and rfieldname in >>>>> rtable._primarykey or \ >>>>> rfield.unique: >>>>> ftype = types[rfield.type[:9]] % \ >>>>> dict(length=rfield.length) >>>>> >>>>> # multicolumn primary key reference? >>>>> if not rfield.unique and len(rtable._primarykey)>1: >>>>> # then it has to be a table level FK >>>>> if rtablename not in TFK: >>>>> >>>>> >>>>> >>>>> >>>>> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.