2017-01-06 46 views
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))) 

回答

0

非常接近,嘗試用:

ses.query(Media).filter(Media.files.in_(asset.paths)) 
+1

我得到一個NotImplementedError當我嘗試: in_()尚未支持關係。對於一個簡單的多對一的,使用in_()對外鍵值集合 我想也許我有一箇舊版本的sqlalchemy,但它是1.1.4。所以我有點失落。 – user2659205