我有这 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_id
是 rtspserverendpoint
表的外键,site_id
是 Camera 表的外键。
当用户想要添加新的 rtspserverendpoint
记录时,他会发出一个 HTTP 请求,例如:
POST 站点/
在添加新的 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 模型中添加一个约束,禁止在数据库中添加这种不一致的记录。
答案 0 :(得分:1)
我不知道有什么直接的方法可以直接对数据库实施这种 2 级检查。
事实上,数据库应该知道的唯一一致性是您的新 Transactions
实例将属于正确的 RtspServerEndpoint
实例。但默认情况下,这将是正确的,因为您将创建 Camera
实例。
因此,在我看来,对 POST 请求的 URL 中 RtspServerEndpoint
的正确性的检查应该在您的代码逻辑中实现。我可能会这样做:
site_id