SQLAlchemy декларативный orm - модель для нескольких таблиц - PullRequest
0 голосов
/ 27 мая 2018

Предположим, я определяю модель,

from app import db
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.dialects.postgresql import JSONB

class Result(object):
    # identification
    id = db.Column(db.Integer, primary_key=True)

    @declared_attr
    def job_id(cls):
        return db.Column(db.Integer, db.ForeignKey('jobs.id'))

    @declared_attr
    def job(cls):
        return db.relationship('Job')

    item = db.Column(db.String, nullable=False)
    when_completed = db.Column(db.DateTime, nullable=False)

    # payload
    data = db.Column(JSONB, nullable=False)

class AxialColorResult(Result, db.Model):
    __tablename__ = 'axial_color'


class LateralColorResult(Result, db.Model):
    __tablename__ = 'lateral_color'


class DistortionResult(Result, db.Model):
    __tablename__ = 'distortion'

...

Result - это смесь / основа для различных типов или «подклассов» результатов, каждый из которых определяет __tablename__.В моем приложении я также хотел бы иметь возможность размещать временные Result s в базе данных, которые живут до 24 часов;триггер для временной таблицы уничтожит все результаты

С ORM в SQLALchemy мне неясно, как это сделать без определения другого класса для каждого временного результата.Есть ли элегантный способ сделать это?

Возможно, мне следует добавить столбец type к Result, так как между типами результатов изменяется только столбец data / JSONB, а затем все типы Results живут в одной таблице, и у меня есть толькоподкласс с TempResult один раз?

...