【问题标题】:sqlalchemy many-to-many relationship (tag system)sqlalchemy 多对多关系(标签系统)
【发布时间】:2014-05-15 07:19:45
【问题描述】:

我有三个表:filefile_tagtag
现在我想查找所有带有 ID 为 13 的标签的文件。

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

如果可能的话我不想使用子查询,我听说它们很慢;)

【问题讨论】:

    标签: python sql python-3.x sqlalchemy


    【解决方案1】:

    请试试这个:

    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)))
    

    它包含一个子查询,但我认为不使用它们是不可能实现你想要的。

    【讨论】:

    • 这是有效的,但我需要 sqlalchemy 代码,拜托!
    • 另外,我以前从未使用过 sqlalchemy,我已经尝试为您生产合适的。请参阅编辑。
    • 我认为每个标签有 1 个子查询是可以的,但如果我有一个 list() 标签(从 0 到 x 个标签),你能告诉我自动执行此操作吗?例如:searched_tags = list(1, 3, 10, 15, ...).
    • 您的意思是要搜索包含预定义列表中所有标签的文件?
    • 是的。我从用户输入中解析我正在寻找的标签,之后我有一个包含所有标签的 python 列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2019-06-22
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多