Skip to content

Commit aff0036

Browse files
author
percious
committed
sa declarative working for one-many relations.
1 parent b05d307 commit aff0036

1 file changed

Lines changed: 32 additions & 20 deletions

File tree

sqlautocode/declarative.py

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -214,24 +214,31 @@ def _relation_repr(cls, rel):
214214
@classmethod
215215
def __repr__(cls):
216216
log.debug('repring class with name %s'%cls.__name__)
217-
mapper = class_mapper(cls)
218-
s = ""
219-
s += "class "+model_name+'(DeclarativeBase):\n'
220-
if is_many_to_many_table:
221-
s += " __table__ = %s\n\n"%table_name
222-
else:
223-
s += " __tablename__ = '%s'\n\n"%table_name
224-
if hasattr(cls, '__table_args__'):
225-
s+=" __table_args__ = %s"%cls.__table_args__
226-
s += " #column definitions\n"
227-
for column in sorted(cls.__table__.c, by_name):
228-
s += " %s = %s\n"%(column.name, column_repr(column))
229-
s += "\n #relation definitions\n"
230-
ess = s
231-
for prop in mapper.iterate_properties:
232-
if isinstance(prop, RelationshipProperty):
233-
s+=' %s\n'%cls._relation_repr(prop)
234-
return s
217+
try:
218+
mapper = class_mapper(cls)
219+
s = ""
220+
s += "class "+model_name+'(DeclarativeBase):\n'
221+
if is_many_to_many_table:
222+
s += " __table__ = %s\n\n"%table_name
223+
else:
224+
s += " __tablename__ = '%s'\n\n"%table_name
225+
if hasattr(cls, '__table_args__'):
226+
s+=" __table_args__ = %s"%cls.__table_args__
227+
s += " #column definitions\n"
228+
for column in sorted(cls.__table__.c, by_name):
229+
s += " %s = %s\n"%(column.name, column_repr(column))
230+
s += "\n #relation definitions\n"
231+
ess = s
232+
for prop in mapper.iterate_properties:
233+
if isinstance(prop, RelationshipProperty):
234+
s+=' %s\n'%cls._relation_repr(prop)
235+
return s
236+
except Exception, e:
237+
log.error("Could not generate class for: %s"%cls.__name__)
238+
from traceback import format_exc
239+
log.error(format_exc())
240+
return ''
241+
235242

236243
#hack the class to have the right classname
237244
Temporal.__name__ = model_name
@@ -245,17 +252,21 @@ def __repr__(cls):
245252
Temporal._decl_class_registry[model_name] = Temporal._decl_class_registry['Temporal']
246253
del Temporal._decl_class_registry['Temporal']
247254

255+
248256
#add in single relations
249257
fks = self.get_foreign_keys(table)
250258
for related_table in sorted(fks.keys(), by_name):
251259
columns = fks[related_table]
252260
if len(columns)>1:
253261
continue
262+
column = columns[0]
254263
log.info(' Adding <primary> foreign key for:%s'%related_table.name)
255264
backref_name = plural(table_name)
256-
rel = relation(singular(name2label(related_table.name, related_table.schema)))#, backref=backref_name)
265+
# import ipdb; ipdb.set_trace()
266+
rel = relation(singular(name2label(related_table.name, related_table.schema)), primaryjoin=column==column.foreign_keys[0].column)#, backref=backref_name)
257267
setattr(Temporal, related_table.name, _deferred_relationship(Temporal, rel))
258268

269+
"""
259270
#add in many-to-many relations
260271
for join_table in self.get_related_many_to_many_tables(table.name):
261272
for column in join_table.columns:
@@ -269,7 +280,8 @@ def __repr__(cls):
269280
related_table.schema)),
270281
secondary=join_table)))
271282
break;
272-
283+
284+
"""
273285
return Temporal
274286

275287
def get_table(self, name):

0 commit comments

Comments
 (0)