Skip to content
Snippets Groups Projects
Commit d0234c76 authored by joe's avatar joe
Browse files

Fixing issue with two-way referenced relations in the sqlalchemy interface (closes issue #13)

parent e5dc6836
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ class SqlAlchemyGenerator(object): ...@@ -8,6 +8,7 @@ class SqlAlchemyGenerator(object):
def __init__(self, schema_obj): def __init__(self, schema_obj):
self.schema = schema_obj self.schema = schema_obj
self.defined_relations = []
def _audit_table_def(self): def _audit_table_def(self):
return """ return """
...@@ -76,6 +77,13 @@ class %(class_name)s(Base): ...@@ -76,6 +77,13 @@ class %(class_name)s(Base):
field.name, ', '.join(args)) field.name, ', '.join(args))
def _sa_field_relation_def(self, entity, field): def _sa_field_relation_def(self, entity, field):
assoc_table = self._sa_assoc_table_name(field)
if assoc_table in self.defined_relations:
# In this case, we don't need a backref (it already exists)
return '%s = relationship("%s", secondary=%s)' % (
field.name,
field.remote_name.capitalize(),
assoc_table + '_table')
return '%s = relationship("%s", secondary=%s, backref="%s")' % ( return '%s = relationship("%s", secondary=%s, backref="%s")' % (
field.name, field.name,
field.remote_name.capitalize(), field.remote_name.capitalize(),
...@@ -83,12 +91,17 @@ class %(class_name)s(Base): ...@@ -83,12 +91,17 @@ class %(class_name)s(Base):
pl.plural(entity.name)) pl.plural(entity.name))
def _sa_field_assoc_table_def(self, entity, field): def _sa_field_assoc_table_def(self, entity, field):
table_name = self._sa_assoc_table_name(field)
if table_name in self.defined_relations:
#we have a 2-way used relation, and do not want to re-define it
return ""
self.defined_relations.append(table_name)
return """ return """
%s_table = Table('%s', Base.metadata, %s_table = Table('%s', Base.metadata,
Column('left_id', Integer, ForeignKey('%s.id')), Column('left_id', Integer, ForeignKey('%s.id')),
Column('right_id', Integer, ForeignKey('%s.id')))""" % ( Column('right_id', Integer, ForeignKey('%s.id')))""" % (
self._sa_assoc_table_name(field), table_name,
self._sa_assoc_table_name(field), table_name,
field.local_name, field.local_name,
field.remote_name) field.remote_name)
...@@ -106,4 +119,3 @@ class %(class_name)s(Base): ...@@ -106,4 +119,3 @@ class %(class_name)s(Base):
out.append(self._sa_entity_aux_tables(ent)) out.append(self._sa_entity_aux_tables(ent))
out.append(self._sa_entity_def(ent)) out.append(self._sa_entity_def(ent))
return '\n'.join(out) return '\n'.join(out)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment