Skip to content

Commit 6e35ac6

Browse files
committed
fix #579, allow __tablename__ to be a declared_attr
1 parent 2c233e9 commit 6e35ac6

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

gino/declarative.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,7 @@ def __init__(self):
144144

145145
@classmethod
146146
def _init_table(cls, sub_cls):
147-
table_name = getattr(sub_cls, '__tablename__', None)
148-
if table_name is None:
149-
return
150-
147+
table_name = None
151148
columns = []
152149
inspected_args = []
153150
updates = {}
@@ -156,6 +153,9 @@ def _init_table(cls, sub_cls):
156153
for k, v in getattr(each_cls, '__namespace__',
157154
each_cls.__dict__).items():
158155
if callable(v) and getattr(v, '__declared_attr__', False):
156+
if k == '__tablename__':
157+
table_name = v(sub_cls)
158+
continue
159159
v = updates[k] = v(sub_cls)
160160
if isinstance(v, sa.Column):
161161
v = v.copy()
@@ -166,6 +166,10 @@ def _init_table(cls, sub_cls):
166166
updates[k] = sub_cls.__attr_factory__(k, v)
167167
elif isinstance(v, (sa.Index, sa.Constraint)):
168168
inspected_args.append(v)
169+
if table_name is None:
170+
table_name = getattr(sub_cls, '__tablename__', None)
171+
if table_name is None:
172+
return
169173
sub_cls._column_name_map = column_name_map
170174

171175
# handle __table_args__

tests/test_declarative.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ class Model(db.Model):
5353
assert hasattr(Model.__table__.c, 'col2')
5454
assert hasattr(Model.__table__.c, 'col3')
5555

56+
class Model(db.Model):
57+
@db.declared_attr
58+
def __tablename__(cls):
59+
return 'model5'
60+
61+
assert Model.__table__.name == 'model5'
62+
5663

5764
async def test_inline_constraints_and_indexes(bind, engine):
5865
u = await User.create(nickname='test')

0 commit comments

Comments
 (0)