具有复合键的 SQLAlchemy 表继承?

问题描述 投票:0回答:0

我正在尝试使用基表上的复合键创建类表继承。我正在尝试创建类似于 this answer 的时间。但是,我正在创建的表格是

EntityWithImages
Experiment
Sample
Images
;到目前为止我的代码是,

class EntityWithImages(db.Model):
    __tablename__ = "entity_images"

    id = db.Column(db.Integer, primary_key=True)
    entity_type = db.Column(db.String(32), nullable=False)

    __mapper_args__ = {
        "polymorphic_on": entity_type,
        "polymorphic_identity": "entity_with_images",
    }


class Experiment(TimeStampAuditMixin, EntityWithImages):
    __tablename__ = "experiment"

    # id = db.Column(db.Integer, primary_key=True)
    id = db.Column(None, db.ForeignKey('entity_images.id'), primary_key=True)
    experiment_name = db.Column(db.Text, unique=True)

    samples = db.relationship("Sample", back_populates="experiment", foreign_keys="Sample.id")

    __mapper_args__ = {
        "polymorphic_identity": "experiment",
    }

    def __str__(self):
        return self.experiment_name


class Sample(TimeStampAuditMixin, EntityWithImages):
    __tablename__ = "sample"

    # id = db.Column(db.Integer, primary_key=True)
    id = db.Column(None, db.ForeignKey('entity_images.id'), primary_key=True)
    sample_name = db.Column(db.Text, unique=True)
    experiment_id = db.Column(db.ForeignKey("experiment.id", ondelete="CASCADE"))
    
    experiment = db.relationship("Experiment", back_populates="samples", foreign_keys=experiment_id)

    id: int
    sample_name: str
    s3_uri: str
    experiment_id: int
    experiment: "Experiment"

    __mapper_args__ = {
        "polymorphic_identity": "sample",
    }

    def __str__(self):
        return self.sample_name


class ImageSource(db.Model):
    __tablename__ = "image_source"

    id = db.Column(db.Integer, primary_key=True)
    entity_images_id = db.Column(db.ForeignKey("entity_images.id", ondelete="CASCADE"))

我不清楚如何在相应的

entity_type
Experiment
表中详细说明
Sample
的值,即在
Experiment
表中我希望默认
entity_type
experiment

我目前正在使用

SQLAlchemy==1.4.46

flask sqlalchemy flask-sqlalchemy
© www.soinside.com 2019 - 2024. All rights reserved.