self refernces, issue 353, 'refernce .', thanks eenns
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.00.0 (2012-06-05 17:15:12) dev
|
Version 2.00.0 (2012-06-05 17:37:37) dev
|
||||||
|
|||||||
+37
-27
@@ -638,37 +638,47 @@ class BaseAdapter(ConnectionPool):
|
|||||||
ftype = field.type.native or field.type.type
|
ftype = field.type.native or field.type.type
|
||||||
elif field.type.startswith('reference'):
|
elif field.type.startswith('reference'):
|
||||||
referenced = field.type[10:].strip()
|
referenced = field.type[10:].strip()
|
||||||
|
if referenced == '.':
|
||||||
|
referenced = tablename
|
||||||
constraint_name = self.constraint_name(tablename, field.name)
|
constraint_name = self.constraint_name(tablename, field.name)
|
||||||
if hasattr(table,'_primarykey'):
|
if not '.' in referenced \
|
||||||
rtablename,rfieldname = referenced.split('.')
|
and referenced != tablename) \
|
||||||
rtable = table._db[rtablename]
|
and hasattr(table,'_primarykey'):
|
||||||
rfield = rtable[rfieldname]
|
ftype = self.types['integer']
|
||||||
# must be PK reference or unique
|
else:
|
||||||
if rfieldname in rtable._primarykey or rfield.unique:
|
if hasattr(table,'_primarykey'):
|
||||||
ftype = self.types[rfield.type[:9]] % dict(length=rfield.length)
|
rtablename,rfieldname = referenced.split('.')
|
||||||
# multicolumn primary key reference?
|
rtable = table._db[rtablename]
|
||||||
if not rfield.unique and len(rtable._primarykey)>1 :
|
rfield = rtable[rfieldname]
|
||||||
# then it has to be a table level FK
|
# must be PK reference or unique
|
||||||
if rtablename not in TFK:
|
if rfieldname in rtable._primarykey or rfield.unique:
|
||||||
TFK[rtablename] = {}
|
ftype = self.types[rfield.type[:9]] % \
|
||||||
TFK[rtablename][rfieldname] = field.name
|
dict(length=rfield.length)
|
||||||
else:
|
# multicolumn primary key reference?
|
||||||
ftype = ftype + \
|
if not rfield.unique and len(rtable._primarykey)>1:
|
||||||
self.types['reference FK'] %dict(\
|
# then it has to be a table level FK
|
||||||
|
if rtablename not in TFK:
|
||||||
|
TFK[rtablename] = {}
|
||||||
|
TFK[rtablename][rfieldname] = field.name
|
||||||
|
else:
|
||||||
|
ftype = ftype + self.types['reference FK'] \
|
||||||
|
% dict(
|
||||||
constraint_name=constraint_name,
|
constraint_name=constraint_name,
|
||||||
table_name=tablename,
|
table_name=tablename,
|
||||||
field_name=field.name,
|
field_name=field.name,
|
||||||
foreign_key='%s (%s)'%(rtablename, rfieldname),
|
foreign_key='%s (%s)'%(rtablename, rfieldname),
|
||||||
on_delete_action=field.ondelete)
|
on_delete_action=field.ondelete)
|
||||||
else:
|
else:
|
||||||
# make a guess here for circular references
|
# make a guess here for circular references
|
||||||
id_fieldname = referenced in table._db and table._db[referenced]._id.name or 'id'
|
id_fieldname = referenced in table._db \
|
||||||
ftype = self.types[field.type[:9]]\
|
and table._db[referenced]._id.name or 'id'
|
||||||
% dict(table_name=tablename,
|
ftype = self.types[field.type[:9]] % \
|
||||||
field_name=field.name,
|
dict(table_name=tablename,
|
||||||
constraint_name=constraint_name,
|
field_name=field.name,
|
||||||
foreign_key=referenced + ('(%s)' % id_fieldname),
|
constraint_name=constraint_name,
|
||||||
on_delete_action=field.ondelete)
|
foreign_key=referenced + \
|
||||||
|
('(%s)' % id_fieldname),
|
||||||
|
on_delete_action=field.ondelete)
|
||||||
elif field.type.startswith('list:reference'):
|
elif field.type.startswith('list:reference'):
|
||||||
ftype = self.types[field.type[:14]]
|
ftype = self.types[field.type[:14]]
|
||||||
elif field.type.startswith('decimal'):
|
elif field.type.startswith('decimal'):
|
||||||
@@ -679,8 +689,8 @@ class BaseAdapter(ConnectionPool):
|
|||||||
srid = self.srid
|
srid = self.srid
|
||||||
geotype, parms = field.type[:-1].split('(')
|
geotype, parms = field.type[:-1].split('(')
|
||||||
if not geotype in self.types:
|
if not geotype in self.types:
|
||||||
raise SyntaxError, 'Field: unknown field type: %s for %s' % \
|
raise SyntaxError, 'Field: unknown field type: %s for %s' \
|
||||||
(field.type, field.name)
|
% (field.type, field.name)
|
||||||
ftype = self.types[geotype]
|
ftype = self.types[geotype]
|
||||||
if self.dbengine == 'postgres' and geotype == 'geometry':
|
if self.dbengine == 'postgres' and geotype == 'geometry':
|
||||||
# parameters: schema, srid, dimension
|
# parameters: schema, srid, dimension
|
||||||
|
|||||||
Reference in New Issue
Block a user