Skip to content

Commit 804fdc8

Browse files
committed
fix mixin issues
1 parent 65aed13 commit 804fdc8

File tree

3 files changed

+56
-0
lines changed

3 files changed

+56
-0
lines changed

src/gino/declarative.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ def _init_table(cls, sub_cls):
315315
updates[k] = sub_cls.__attr_factory__(k, v)
316316
elif isinstance(v, (sa.Index, sa.Constraint)):
317317
inspected_args.append(v)
318+
elif isinstance(v, json_support.JSONProperty):
319+
updates[k] = v
318320
if table_name is None:
319321
return
320322
sub_cls._column_name_map = column_name_map
@@ -351,6 +353,8 @@ def _init_table(cls, sub_cls):
351353
for each_cls in sub_cls.__mro__[::-1]:
352354
for k, v in each_cls.__dict__.items():
353355
if isinstance(v, json_support.JSONProperty):
356+
if not v.name:
357+
v.name = k
354358
json_col = getattr(
355359
sub_cls.__dict__.get(v.prop_name), "column", None
356360
)

tests/test_declarative.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,34 @@ class Another(Audit, db.Model):
179179
assert False, "Should not reach here"
180180

181181

182+
async def test_mixin_crud(engine):
183+
db = gino.Gino()
184+
db.bind = engine
185+
186+
class Mixin:
187+
id = db.Column(db.Integer, primary_key=True)
188+
name = db.Column(db.Text)
189+
190+
class MixinCrud(db.Model, Mixin):
191+
__tablename__ = "mixin_crud"
192+
193+
await db.gino.create_all()
194+
try:
195+
mc = await MixinCrud.create(name="mctest")
196+
assert mc.name == "mctest"
197+
198+
await mc.update(name="updated").apply()
199+
200+
mc = await MixinCrud.query.gino.first()
201+
assert mc.name == "updated"
202+
203+
await mc.delete()
204+
mc = await MixinCrud.query.gino.first()
205+
assert mc is None
206+
finally:
207+
await db.gino.drop_all()
208+
209+
182210
# noinspection PyUnusedLocal
183211
async def test_inherit_constraint():
184212
with pytest.raises(ValueError, match="already attached to another table"):

tests/test_json.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,27 @@ def age_idx(cls):
312312

313313
await IndexTest.gino.create()
314314
await IndexTest.gino.drop()
315+
316+
317+
async def test_mixin(bind):
318+
from gino.dialects.asyncpg import JSONB
319+
320+
class Base:
321+
id = db.Column(db.Integer(), primary_key=True)
322+
profile = db.Column(JSONB())
323+
324+
class Mixin(Base):
325+
age = db.IntegerProperty()
326+
327+
class MixinTest(db.Model, Mixin):
328+
__tablename__ = "mixin_test"
329+
330+
await MixinTest.gino.create()
331+
try:
332+
mt = await MixinTest.create(age=22)
333+
await mt.update(age=24).apply()
334+
assert (await MixinTest.query.gino.first()).age == 24
335+
await mt.update(age=MixinTest.age - 5).apply()
336+
assert (await MixinTest.query.gino.first()).age == 19
337+
finally:
338+
await MixinTest.gino.drop()

0 commit comments

Comments
 (0)