Flask-SQLAlchemy无关联模型继承:如何实现代码复用?
SQLAlchemy 模型继承复用方案解答
1. 直接继承db.Model并加__tablename__的问题
- 要是基类和子类都定义了
__tablename__,SQLAlchemy默认会启用联合表继承,这时候基类会生成对应的数据表,子类表会通过外键和基类表关联,查询时自动做Join,确实会产生你不想看到的关联关系。 - 要是只在子类定义
__tablename__、基类不定义,会变成单表继承,所有子类的数据都存在同一张表,靠一个判别字段区分,这也不符合你要四个独立表的需求。
2. 无关联代码复用的正确姿势:抽象基类
不想生成关联的话,把基类设为抽象类就行——它只用来共享字段和逻辑,不会映射到数据库表。具体操作:
- 基类继承db.Model,但加上
__abstract__ = True,不要定义__tablename__。 - 每个子类继承这个抽象基类,然后自己定义
__tablename__和那个独有的字段。
举个实际代码例子:
from flask_sqlalchemy import SQLAlchemy from datetime import datetime db = SQLAlchemy() # 抽象基类:仅复用代码,不生成数据库表 class SharedModel(db.Model): __abstract__ = True # 所有子类共享的字段 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) create_time = db.Column(db.DateTime, default=datetime.utcnow) # 子类1:添加专属字段 class ModelA(SharedModel): __tablename__ = 'model_a' unique_field_a = db.Column(db.String(50)) # 子类2:添加另一个专属字段 class ModelB(SharedModel): __tablename__ = 'model_b' unique_field_b = db.Column(db.Integer) # 同理实现ModelC、ModelD即可
这样每个子类都会生成独立的数据表,彼此之间没有任何关联,同时完美复用了基类的所有字段,完全满足你代码整洁、避免重复的需求。
3. 关于SQLAlchemy的Base类
如果用的是原生SQLAlchemy(不是Flask-SQLAlchemy),一般会用declarative_base()生成的Base类作为模型基类。而Flask-SQLAlchemy的db.Model其实就是封装了这个Base类,所以上面的方案不管哪种场景都适用,核心就是给基类加上__abstract__ = True标记。
内容的提问来源于stack exchange,提问作者rubmz
相关产品推荐
相关产品推荐

