首页 > 解决方案 > 我找不到如何在 sqlalchemy 中设置关系

问题描述

我正在编写一个与 PostgreSQL 数据库和 sqlalchemy 连接的应用程序作为 ORM。我可以使用简化模式(相机和房间)中的两个类,但没有任何关系。因此,例如,如果我选择所有房间,我将无法列出他们的相机。

错误:

sqlalchemy.exc.InvalidRequestError:一个或多个映射器无法初始化 - 无法继续初始化其他映射器。触发映射器:'映射类 Room->room'。最初的例外是:初始化映射器映射类 Room->room 时,表达式“Camera”未能找到名称(“Camera”)。如果这是一个类名,请考虑在定义了两个依赖类之后将此 relationship() 添加到 <class 'models.room.Room'> 类。

# room.py
from sqlalchemy import Integer, Column, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class Room(Base):
    __tablename__ = 'room'

    id_room = Column(Integer, primary_key=True)

    cameras = relationship("Camera", back_populates="room")
# camera.py
from sqlalchemy import Integer, Column, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class Camera(Base):
    __tablename__ = 'camera'

    id_camera = Column(Integer, primary_key=True)

    id_room = Column(Integer, ForeignKey('room.id_room'))

    room = relationship("Room", back_populates="cameras")

标签: pythonsqlalchemy

解决方案


只需在一个 models.py 文件中定义这两个类 -

# models.py

from sqlalchemy import Integer, Column, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Room(Base):
    __tablename__ = 'room'
    id_room = Column(Integer, primary_key=True)
    cameras = relationship("Camera", back_populates="room")


class Camera(Base):
    __tablename__ = 'camera'
    id_camera = Column(Integer, primary_key=True)
    id_room = Column(Integer, ForeignKey('room.id_room'))
    room = relationship("Room", back_populates="cameras")

推荐阅读