Skip to content

Instantly share code, notes, and snippets.

@kataev
Last active October 18, 2019 08:51
Show Gist options
  • Save kataev/f0eaf42d14c30aac9aafcf6b0c554c0c to your computer and use it in GitHub Desktop.
Save kataev/f0eaf42d14c30aac9aafcf6b0c554c0c to your computer and use it in GitHub Desktop.
import sqlalchemy as sa
from sqlalchemy.ext.declarative import as_declarative, declared_attr
@as_declarative()
class Base1:
@declared_attr
def __tablename__(cls) -> str:
return cls.__name__ # type: ignore
@declared_attr
def id(cls):
return sa.Column(f'{cls.__tablename__}_id', sa.Integer, primary_key=True)
class Kek(Base1):
some_other_column = sa.Column(sa.Text)
""" Primary key column ID must be first column in table :( """
columns = list(Kek.__table__.columns)
if columns.index(Kek.some_other_column) > columns.index(Kek.id):
print('OK')
else:
print('wrong order')
@as_declarative()
class Base2:
@declared_attr
def __tablename__(cls) -> str:
return cls.__name__ # type: ignore
class MixIn:
@declared_attr
def id(cls):
return sa.Column(f'{cls.__tablename__}_id', sa.Integer, primary_key=True)
class Lol(Base2, MixIn):
some_other_column = sa.Column(sa.Text)
columns = list(Lol.__table__.columns)
if columns.index(Lol.some_other_column) > columns.index(Lol.id):
print('OK')
else:
print('wrong order')
class Lol2(MixIn, Base2):
some_other_column = sa.Column(sa.Text)
columns = list(Lol2.__table__.columns)
if columns.index(Lol2.some_other_column) > columns.index(Lol2.id):
print('OK')
else:
print('wrong order')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment