SQLAlchemy 加入 Table 继承:添加问题 objects

SQLAlchemy Joined Table Inheritance: Problem adding objects

我在尝试按照 https://docs.sqlalchemy.org/en/14/orm/inheritance.html 中的说明使用 SQLAlchemy 添加继承 objects 以实现 Joined Table 继承 时遇到问题。

我使用 PostgreSQL 版本 14 作为数据库引擎。

这是我的 Base 配置:

import os
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.automap import automap_base

db_string = os.environ['DB_STRING']

engine = create_engine(db_string)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base = automap_base()
Base.query = db_session.query_property()
Base.prepare(engine, reflect=True)

这里是仪器(parentclass)定义:

from sqlalchemy import Column,  String
from context_model.database import Base


class Instrument(Base):
    __tablename__ = "instrument"

    _id = Column(String, primary_key=True)
    discriminator = Column(String)

    __mapper_args__ = {
        'polymorphic_identity': 'instrument',
        'polymorphic_on': discriminator

这里是 Bond (child class) 定义:

import datetime as dt

from sqlalchemy import Column, Integer, Float, String, DateTime, ForeignKey
from sqlalchemy.orm import relationship
from context_model.instrument.instrument import Instrument


class Bond(Instrument):
    __tablename__ = "bond"

    _id = Column(String, ForeignKey("instrument._id"), primary_key=True)
    _provider_bbg_id = Column(String)

    __mapper_args__ = {
        'polymorphic_identity': 'bond'
    }

当我尝试添加 Bond 实例并将其保存到数据库时:

Bond = Base.classes.bond
bond = Bond()
bond._id = "0"
bond._provider_bbg_id = "XXX"
db_session.add(bond)
db_session.commit()

出现如下错误信息:

sqlalchemy.exc.IntegrityError: (psycopg2.errors.ForeignKeyViolation) insert or update on table "bond" violates foreign key constraint "bond__id_fkey"
DETAIL:  Key (_id)=(0) is not present in table "instrument"."

在我看来,由于某种原因,继承不起作用,我是否很好地定义了 Instrument (parent) 和 Bond (child) classes ?,也许我需要使用另一种类型的 Base ? (我正在使用 automap_base

在此先感谢您的帮助!

我不知道确切原因,但我按照@snakecharmerb 在评论中的建议从 declarative_base() 更改为 automap_base(),现在可以使用了:)