防止SQLAlchemy模型声明中的代码重复

时间:2019-11-09 09:32:46

标签: python sqlalchemy

我目前正在为数据库实现模型类。 我意识到,由于我多次出现一个仅包含idname列的表,因此声明它们的模型类是相等的,并且看起来很像:

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和{{ 1}}的继承,它将包含共享代码,并且MyModel2MyModel的代码将类似于以下内容:

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' 抽象化,因为它不是我的应用程序的实际实体,并且我想防止创建该类型的对象。当我尝试通过继承MyBaseModelsql_alchemy.Model来做到这一点时,我遇到了元类冲突

谢谢

0 个答案:

没有答案