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()
,现在可以使用了:)
我在尝试按照 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()
,现在可以使用了:)