0
我是新來使用sqlalchemy,我試圖找出如何找到兩個多對多關係的交集。鑑於以下佈局:Sqlalchemy查找兩個多對多的交叉點
MediaPathRelationship = Table(
"media_paths", Base.metadata,
Column("media_id", Integer, ForeignKey("media.id"),
Column("path_id", Integer, ForeignKey("file_path.id")))
)
AssetPathRelationship = Table(
"asset_paths", Base.metadata,
Column("asset_id", Integer, ForeignKey("asset.id")),
Column("path_id", Integer, ForeignKey("file_path.id"))
)
class FilePath(Base):
__tablename__ = "file_path"
id = Column(Integer, primary_key=True, autoincrement=True)
path = Column(String, unique=True)
class Media(Base):
__tablename__ = "media"
id = Column(Integer, primary_key=True, autoincrement=True)
files = relationship("FilePath", secondary=MediaPathRelationship)
class Asset(Base):
__tablename__ = "asset"
id = Column(Integer, primary_key=True, autoincrement=True)
paths = relationship("FilePath", secondary=AssetPathRelationship)
ses = Session()
path = FilePath(path="/path/to/something")
ses.add(path)
asset = Asset(paths=[path])
ses.add(asset)
media = Media(files=[path])
ses.add(media)
ses.commit()
如果我有資產,我想找到所有包含該資產的路徑的媒體。那個查詢會是什麼樣子?
asset = ses.query(Asset).first()
ses.query(Media).filter_by(Media.files.contains(asset.files))
或類似的東西。
我想也許this方式相關但不完全。
編輯:
我想出迄今最好的:
paths = [p.path for p in asset.paths]
ses.query(Media).filter(Media.files.any(FilePath.path.in_(paths)))
我得到一個NotImplementedError當我嘗試: in_()尚未支持關係。對於一個簡單的多對一的,使用in_()對外鍵值集合 我想也許我有一箇舊版本的sqlalchemy,但它是1.1.4。所以我有點失落。 – user2659205