sqlalchemy 如何完全精确匹配外键?

准备查询一个Doc表的Tag外键。 需要完全匹配。 但是下面代码只能实现任意匹配。

query = DataBaseEngineAsset.db_session.query(AssetDocumnet).join(AssetDocumnet.tags)
query = query.filter(Tag.id.in_((3, 7)))

现在Doc如果外键中有3 或者 7, 就会被搜出来,如果DOC必须要同时有3和7是怎么查询呢?

query = query.filter(Tag.id == 3, Tag.id == 7)

这样写什么都查不出来。但感觉是这个意思。

class Tag(DataBaseEngineAsset.Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    doc = relationship("AssetDocumnet", secondary=tag_link)
class AssetDocumnet(DataBaseEngineAsset.Base):
    __tablename__ = "document"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))
    tags = relationship("Tag", secondary=tag_link)

tag_link = Table(
    "tag_link",
    DataBaseEngineAsset.Base.metadata,
    Column("doc_id", Integer, ForeignKey("document.id"), nullable=False, primary_key=True),
    Column("tag_id", Integer, ForeignKey("tag.id"), nullable=False, primary_key=True)
)
阅读 3k
2 个回答

查了半天官网文档还是研究出来了。 用contains 就可以。 任意和全部匹配 只需修改下 or_ 和 and_就行

filter_2 = DataBaseEngineAsset.db_session.query(Tag).filter(Tag.id == 7).one()
filter_3 = DataBaseEngineAsset.db_session.query(Tag).filter(Tag.id == 3).one()

query = DataBaseEngineAsset.db_session.query(AssetDocumnet)
query = query.filter(or_(AssetDocumnet.tags.contains(filter_2), AssetDocumnet.tags.contains(filter_3)))

id 是一个数字,怎么可能即是 3 又是 7 。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题