簡體   English   中英

sqlalchemy多對多關系(標簽系統)

[英]sqlalchemy many-to-many relationship (tag system)

我有三個表: filefile_tagtag
現在,我想查找所有具有ID為13的標簽的文件。

表:文件 表格:file_tag 表格:標簽

class File_Tag(Base):
    __tablename__ = 'file_tag'

    id = Column(Integer, primary_key=True)
    file_id = Column('file_id', Integer, ForeignKey('file.id'))
    tag_id = Column('tag_id', Integer, ForeignKey('tag.id'))


class File(Base):
    __tablename__ = 'file'

    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    tags = relationship('File_Tag')

class Tag(Base):
    __tablename__ = 'tag'

    id = Column(Integer, primary_key=True)
    name = Column(String(255))
    files = relationship('File_Tag')

這就是我所擁有的:

session.query(File).join(File.tags).filter(File_Tag.tag_id.in_([1, 3]))

問題是它向我顯示了帶有標簽13所有文件,我想查看帶有標簽13所有文件。

它產生的SQL查詢如下所示:

SELECT file.id   AS file_id,
  file.name      AS file_name,
  file.sha1      AS file_sha1,
  file.import_id AS file_import_id
FROM file
INNER JOIN file_tag
ON file.id             = file_tag.file_id
WHERE file_tag.tag_id IN (1, 3)
GROUP BY file.id

至於結果我得到的文件234 ,但我應該得到的只是文件24

我不想在可能的情況下使用子查詢,聽說它們很慢;)

請嘗試以下方法:

SELECT file.id   AS file_id,
  file.name      AS file_name,
  file.sha1      AS file_sha1,
  file.import_id AS file_import_id
FROM file
INNER JOIN file_tag
ON file.id            = file_tag.file_id
WHERE file_tag.tag_id =1
AND file_tag.file_id IN
  (SELECT file_id FROM file_tag WHERE tag_id=3
  )
GROUP BY file.id;

另外,sqlalchemy應該類似於:

subq=session.query(File_Tag).filter(File_Tag.tag_id=3);
session.query(File).join(File.tags).filter((File_Tag.tag_id=1)&(File_Tag.file_id.in(subq)))

它包含一個子查詢,但我認為這是不可能實現你想要什么,而無需使用它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM