Предотвращение дублирования кода в объявлении модели SQLAlchemy - PullRequest
0 голосов
/ 09 ноября 2019

В настоящее время я работаю над реализацией классов моделей для моей базы данных. Я понял, так как у меня есть более одного вхождения таблицы, которая имеет только столбцы id и name, классы моделей, которые объявляют их равными и выглядят примерно так:

sql_alchemy = SQLAlchemy()

class MyModel(sql_alchemy.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

    def __init__(self, name):
        self.name = name

И несколько других методов, которыми можно поделиться ...

Кроме того, у меня есть другой класс с внешним ключом к таблице, которую представляет модель:

class MyRecord(sql_alchemy.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)
    my_model_id = db.Column(db.Integer, ForeignKey('my_model.id'), nullable=False)

    def __init__(self, name, my_model_id):
        self.name = name
        self.my_model_id= my_model_id

Сначала я подумал, чтоне писать другой класс, который выглядит точно так же, как MyModel, просто с другим именем (MyModel2). Я бы реализовал базовый класс, от которого наследуются оба MyModel & MyModel2, и он будет содержать общий код и код MyModel & MyModel2 будет выглядеть примерно так:

sql_alchemy = SQLAlchemy()

class MyBaseModel(sql_alchemy.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)

    def __init__(self, name):
        self.name = name


class MyModel(BaseNamedModel):
    def __init__(self, name):
        super().__init__(name)


class MyModel2(BaseNamedModel):
    def __init__(self, name):
        super().__init__(name)

когда я пытался сделать это MyRecord через исключение:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'my_record.my_model_id' could not find table 'my_model' with which to generate a foreign key to target column 'id'

Во-вторых, я хотел бы сделатьMyBaseModel аннотация, так как это не фактическая сущность моего приложения, и я хотел бы предотвратить создание объекта этого типа. Когда я попытался сделать это, унаследовав оба sql_alchemy.Model и ABC, я получил конфликт метакласса

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...