【发布时间】:2018-02-22 06:39:58
【问题描述】:
在 sqlalchemy 中,我为我的数据库定义了一个模型,在本例中是两个表“sample”和“experiment”,它们通过多对多关系相互链接:
class Sample(Base):
__tablename__ = 'sample'
id = Column(Integer, primary_key=True)
name = Column(String)
date = Column(String)
class Experiment(Base):
__tablename__ = 'experiment'
id = Column(Integer, primary_key=True)
name = Column(String)
description = Column(String)
result = Column(String)
samples = relationship('Sample', secondary='sample_has_experiment', backref="experiments")
t_sample_has_experiment = Table(
'sample_has_experiment', metadata,
Column('sample_id', ForeignKey('sample.id'), primary_key=True, nullable=False, index=True),
Column('experiment_id', ForeignKey('experiment.id'), primary_key=True, nullable=False, index=True)
)
在我的数据库中,我有一个样本“Dilithium”,在实验中有两个实验“Cold fusion”和“Worm hole”。
我尝试通过连接到示例表来查询“虫洞”实验:
samples = s.query(Obj.Sample).join(Obj.Sample.experiments).\
filter(Obj.Experiment.name == "Worm hole").all()
for sample in samples:
for experiment in sample.experiments:
print(experiment.name)
但结果我仍然得到“虫洞”和“冷聚变”两个实验。所以看起来过滤没有应用。如何过滤我只收到“虫洞”实验对象的方式?谢谢。
@Dublicate:确实它看起来像同一个问题,但给定的答案并不能解决我的问题。在我看来,我建议的查询与建议的答案完全相同。
【问题讨论】:
-
i中的for experiment in i.experiments是什么?我想应该是sample... -
谢谢,你说得对,只是创建这个例子时打错了。
-
实际上,建议的答案正是我用于查询的答案,但在我的情况下,结果不知何故未被过滤。
标签: python python-3.x sqlalchemy