Я относительно новый пользователь sqlalchemy и у меня странная проблема, связанная с пересечением определений схемы и шаблонов. У меня есть повторяющийся шаблон в большой схеме, которая имеет версии с атрибуцией пользователя и history_tables. Поэтому я пытаюсь определить абстрактный базовый класс для обработки всех версий. Имена столбцов этой информации обычно, но не всегда одинаковы, поэтому у меня есть следующее
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import *
Base = declarative_base(name="Base")
class VersionedItem(Base):
__abstract__ = True
def __init_subclass__(cls,user_col="user_id", user_rel="user", history_suffix="_h",
version_col='version_num', **kwarg):
setatter(cls, user_rel+"_id", Column(user_col, Integer, ForeignKey('user.user_id')))
setatter(cls, user_rel, relationship('User'))
cls.version = Column(version_col, Integer, nullable=False)
super().__init_subclass__(**kwarg)
cls.__history_tablename__ = cls.__tablename__ + history_suffix
# garbage to do with perevous version finding
last_update = Column('last_update', Datetime, nullable=False)
# more garbage to do with perevous version finding
class NormalData(VersionedItem):
__tablename__ = "datatable"
id = Column("NormalData_id", Integer, primary_key=True)
# data columns
# explotion below
class User(VersionedItem, user_col="authoriser", user_rel="authoriser"):
__tablename__ = "users"
user_id = Column("user_id", Integer, primary_key=True)
username = Column("username", String(32))
# more user information
, если я запускаю это, первый дочерний класс работает, второй, однако, всплывает с ошибкой:
...
class User(VersionedItem, user_col='authoriser', user_rel='authoriser'):
TypeError: __init__() got an unexpected keyword argument 'user_col'
Я проверил в отладчике, и метод init_subclass , кажется, успешно завершен. Я попытался определить методы прохода через init (* args, ** kargs) в User и VersionedItem, чтобы перехватить отладчик и вывести их аргументы; ни один из них не вызывается.
Python версия интерпретатора: 3.7.6 (x64) версия sqlalchemy: 1.3.8
Я бы даже оценил направление, насколько я понимаю, нет init метод должен быть вызван даже в этот момент, не говоря уже о методе, который отсутствует в текущем классе.