Skip to content

Commit f3ebbca

Browse files
author
percious
committed
added support for the situation that occurs when you have
two tables named the same thing, but are in different schemas.
1 parent 870cfb6 commit f3ebbca

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

sqlautocode/declarative.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,21 @@ def __repr__(self):
114114
tables = self.get_many_to_many_tables()
115115
models = self.models
116116

117+
117118
s = StringIO()
118119
engine = self.config.engine
119120
if not isinstance(engine, basestring):
120121
engine = str(engine.url)
121122
s.write(constants.HEADER_DECL%engine)
122123
if 'postgres' in engine:
123124
s.write(constants.PG_IMPORT)
125+
126+
self.used_table_names = []
124127
for table in tables:
125-
s.write('%s = %s\n\n'%(table.name, self._table_repr(table)))
126-
128+
table_name = self.find_new_name(table.name, self.used_table_names)
129+
self.used_table_names.append(table_name)
130+
s.write('%s = %s\n\n'%(table_name, self._table_repr(table)))
131+
127132
for model in models:
128133
s.write(model.__repr__())
129134
s.write("\n\n")
@@ -140,14 +145,30 @@ def tables(self):
140145

141146
@property
142147
def models(self):
148+
self.used_model_names = []
149+
self.used_table_names = []
143150
return sorted((self.create_model(table) for table in self.get_non_many_to_many_tables()), by__name__)
144151

152+
def find_new_name(self, prefix, used, i=0):
153+
if i!=0:
154+
prefix = "%s%d"%(prefix, i)
155+
if prefix in used:
156+
prefix = prefix
157+
return self.find_new_name(prefix, used, i+1)
158+
return prefix
159+
160+
145161
def create_model(self, table):
146162
#partially borrowed from Jorge Vargas' code
147163
#http://dpaste.org/V6YS/
148164

149-
model_name = name2label(table.name)
165+
model_name = self.find_new_name(name2label(table.name), self.used_model_names)
166+
self.used_model_names.append(model_name)
150167
is_many_to_many_table = self.is_many_to_many_table(table)
168+
table_name = self.find_new_name(table.name, self.used_table_names)
169+
self.used_table_names.append(table_name)
170+
171+
151172
class Temporal(self.DeclarativeBase):
152173
__table__ = table
153174

@@ -169,13 +190,14 @@ def _relation_repr(cls, rel):
169190

170191
@classmethod
171192
def __repr__(cls):
193+
172194
mapper = class_mapper(cls)
173195
s = ""
174196
s += "class "+model_name+'(DeclarativeBase):\n'
175197
if is_many_to_many_table:
176-
s += " __table__ = %s\n\n"%table.name
198+
s += " __table__ = %s\n\n"%table_name
177199
else:
178-
s += " __tablename__ = '%s'\n\n"%table.name
200+
s += " __tablename__ = '%s'\n\n"%table_name
179201
if hasattr(cls, '__table_args__'):
180202
s+=" __table_args__ = %s"%cls.__table_args__
181203
s += " #column definitions\n"
@@ -204,7 +226,7 @@ def __repr__(cls):
204226
for column in self.get_foreign_keys(table):
205227
related_table = column.foreign_keys[0].column.table
206228
backref_name = plural(table.name)
207-
setattr(Temporal, related_table.name, _deferred_relation(Temporal, relation(name2label(related_table.name, related_table.schema), backref=backref(backref_name))))
229+
setattr(Temporal, related_table.name, _deferred_relation(Temporal, relation(name2label(related_table.name, related_table.schema))))
208230

209231
#add in many-to-many relations
210232
for join_table in self.get_related_many_to_many_tables(table.name):

0 commit comments

Comments
 (0)