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))
どんなアイデアでも大歓迎です。