【问题标题】:How to properly define a many-to-many relationship in SQLAlchemy?如何在 SQLAlchemy 中正确定义多对多关系?
【发布时间】:2020-11-12 22:22:55
【问题描述】:

在我使用 SQLAlchemyFlask 应用程序中,所有表都定义在一个文件中 models.py:

training_ids_association_table = db.Table(
    "training_ids_association",
    db.Model.metadata,
    Column("training_id", Integer, ForeignKey("training_sessions.id")),
    Column("ids_id", Integer, ForeignKey("image_data_sets.id")),
)

class ImageDataSet(db.Model):
    __tablename__ = "image_data_sets"
    id = Column(Integer, primary_key=True)
    trainings = relationship("Training", secondary=training_ids_association_table, back_populates="image_data_sets")

class TrainingSession(db.Model):
    __tablename__ = "training_sessions"
    id = Column(Integer, primary_key=True)
    image_data_sets = relationship("DataSet", secondary=training_ids_association_table, back_populates="trainings")

所以我想在这里实现的是多对多的关系:

  • 一个ImageDataSet可以属于多个TrainingSession
  • 一个TrainingSession 可以包含多个ImageDataSet

但是,只要我在代码中调用 TrainingSession.query(),就会引发以下错误:

Exception has occurred: InvalidRequestError
When initializing mapper mapped class ImageDataSet->image_data_sets, expression 'Training' failed to locate a name ('Training'). If this is a class name, consider adding this relationship() to the <class 'app.base.models.ImageDataSet'> class after both dependent classes have been defined.

我在这里找到了一些相关的线程,但它们要么要求一对多的关系,要么在不同的文件中定义它们的表。两者都不是这里的情况。

任何想法我做错了什么?

【问题讨论】:

  • 当然你会得到这个错误......你没有表名为 TrainingDataSet 的事情。

标签: python database flask sqlalchemy relationship


【解决方案1】:

你拼错了模型的名称,试试这个:

training_ids_association_table = db.Table(
    "training_ids_association",
    db.Model.metadata,
    Column("training_id", Integer, ForeignKey("training_sessions.id")),
    Column("ids_id", Integer, ForeignKey("image_data_sets.id")),
)

class ImageDataSet(db.Model):
    __tablename__ = "image_data_sets"
    id = Column(Integer, primary_key=True)
    trainings = relationship("TrainingSession", secondary=training_ids_association_table, back_populates="image_data_sets")

class TrainingSession(db.Model):
    __tablename__ = "training_sessions"
    id = Column(Integer, primary_key=True)
    image_data_sets = relationship("ImageDataSet", secondary=training_ids_association_table, back_populates="trainings")

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多