1

3c7のクールなプロジェクトに貢献しようとしていますが、結合クエリ (sqlalchemy) にフィルターを適用したいと考えています。

簡単なステートメント: 複数のルール (テーブル) は複数のタグ (テーブル) を持つことができます - いくつかのタグに基づいていくつかのルールを除外したいと思います。

[Rules][2] table   (rule_id, etc)
[Tags][2] Table    (tag_id, etc)
tags_rules(Junction table) (rule_id,tag_id) -- no declaration

問題: もちろん、参加後にフィルターを適用すると、タグが 1 つしかないルール (指定したもの) のみが削除されます。ルールに複数のタグがある場合、結合結果から 1 つのレコードが削除されますが、そのルールに関連付けられている他のタグがある場合、ルールは引き続き表示されます。

SQL錬金術宣言:

class Rule(Base):
    id = Column(Integer, primary_key=True, index=True, autoincrement=True)
    name = Column(String(255), index=True)
    meta = relationship("Meta", back_populates="rule", cascade="all, delete, delete-orphan")
    strings = relationship("String", back_populates="rule", cascade="all, delete, delete-orphan")
    condition = Column(Text)
    imports = Column(Integer)
    tags = relationship("Tag", back_populates="rules", secondary=tags_rules)
    ruleset_id = Column(Integer, ForeignKey("ruleset.id"))
    ruleset = relationship("Ruleset", back_populates="rules")

class Tag(Base):
    id = Column(Integer, primary_key=True, autoincrement=True, index=True)
    name = Column(String(255), index=True)
    rules = relationship("Rule", back_populates="tags", secondary=tags_rules)

サブクエリを試してみましたが、結合の前にタグテーブルにフィルターを適用するのが最も現実的です。

現在の実装:

rules = rules.select_from(Tag).join(Rule.tags).filter(~Tag.name.in_(tags))

どんなアイデアでも大歓迎です。

4

0 に答える 0