鍍金池/ 問(wèn)答/Python  數(shù)據(jù)庫(kù)/ sqlalchemy 如何完全精確匹配外鍵?

sqlalchemy 如何完全精確匹配外鍵?

準(zhǔn)備查詢一個(gè)Doc表的Tag外鍵。 需要完全匹配。 但是下面代碼只能實(shí)現(xiàn)任意匹配。

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

現(xiàn)在Doc如果外鍵中有3 或者 7, 就會(huì)被搜出來(lái),如果DOC必須要同時(shí)有3和7是怎么查詢呢?

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

這樣寫什么都查不出來(lái)。但感覺是這個(gè)意思。

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)
)
回答
編輯回答
念舊

id 是一個(gè)數(shù)字,怎么可能即是 3 又是 7 。

2018年3月30日 07:12
編輯回答
孤酒

查了半天官網(wǎng)文檔還是研究出來(lái)了。 用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)))
2017年4月20日 09:53