在 SQLAlchemy 中检查外键的外键

时间:2021-04-29 05:31:37

标签: python sqlalchemy

我有这 3 个 sql 炼金术 (sqla) 模型:

class Site(Base):
    __tablename__ = "site"
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow())
    updated_at = Column(DateTime, nullable=True, default=datetime.utcnow(), onupdate=datetime.utcnow)


class Camera(Base):
    __tablename__ = "camera"
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    site_id = Column(UUID(as_uuid=True), ForeignKey("site.id"), nullable=False)
    name = Column(String, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow())
    updated_at = Column(DateTime, nullable=True, default=datetime.utcnow(), onupdate=datetime.utcnow)
    site = relationship("Site", backref="cameras")


class RtspServerEndpoint(Base):
    __tablename__ = "rtsp_server_endpoint"
    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    camera_id = Column(UUID(as_uuid=True), ForeignKey("camera.id"), nullable=False)
    rtsp_url_endpoint = Column(String, nullable=False)
    rtsp_username = Column(String, nullable=False)
    rtsp_encrypted_password = Column(String, nullable=False)
    name = Column(String, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow())
    updated_at = Column(DateTime, nullable=True, default=datetime.utcnow(), onupdate=datetime.utcnow)
    camera = relationship("Camera", backref="rtsp_server_endpoint", lazy="joined")

camera_idrtspserverendpoint 表的外键,site_id 是 Camera 表的外键。

当用户想要添加新的 rtspserverendpoint 记录时,他会发出一个 HTTP 请求,例如: POST 站点//camera//rtspserverendpoint

在添加新的 rtspserverendpoint 之前,我想确保 <site_id><camera_id> 是一致的,作为安全性。我可能可以单独进行查询以进行检查,例如:

check_record_exist = db.session.query(Camera).filter(Camera.site_id == site_id).first()
if not check_record_exist:
    raise ("No such camera with this site_id")

但我想知道的是,是否有更优雅的方法来检查:例如,在我的 Base 模型中添加一个约束,禁止在数据库中添加这种不一致的记录。

1 个答案:

答案 0 :(得分:1)

我不知道有什么直接的方法可以直接对数据库实施这种 2 级检查。

事实上,数据库应该知道的唯一一致性是您的新 Transactions 实例将属于正确的 RtspServerEndpoint 实例。但默认情况下,这将是正确的,因为您将创建 Camera 实例。

因此,在我看来,对 POST 请求的 URL 中 RtspServerEndpoint 的正确性的检查应该在您的代码逻辑中实现。我可能会这样做:

site_id
相关问题