我有一个数据库,用于存储鼠标ID和FMRI测量会话,这些类(为方便起见,列大大减少)如下所示:
class FMRIMeasurement(Base):
__tablename__ = "fmri_measurements"
id = Column(Integer, primary_key=True)
date = Column(DateTime)
animal_id = Column(Integer, ForeignKey('animals.id'))
class Animal(Base):
__tablename__ = "animals"
id = Column(Integer, primary_key=True)
id_eth = Column(Integer)
fmri_measurements = relationship("FMRIMeasurement", backref="animal")
我想创建一个pandas数据帧,保存分配给一个特定动物的所有FMRIMeasurements的所有细节。从该动物中选择数据效果很好:
mystring = str(session.query(Animal).filter(Animal.id_eth == 1))
print pd.read_sql_query(mystring, engine, params=[4001])
但是一旦我尝试选择FMRIMeasurements就会爆炸。没有任何后续工作。
mystring = str(session.query(Animal.fmri_measurements).filter(Animal.id_eth == 1))
mystring = str(session.query(FMRIMeasurement).filter(FMRIMeasurement.animal.id_eth == 1))
mystring = str(session.query(Animal.fmri_measurements.date).filter(Animal.id_eth == 1))
我想我只是错误地使用SQLAlchemy,但是我找不到任何东西可以帮助我处理文档中的用例(也许我不知道我想要做的事情实际上是如何调用的): - /
答案 0 :(得分:1)
session.query
生成一个查询字符串,您需要使用.first()
或.all()
实际执行它以获取结果集
例如
sql_query = session.query(Animal.fmri_measurements).filter(Animal.id_eth == 1)
result_set = sql_query.all() # execute the query and return resultset
for item in result_set:
# do work with item
# if the item changes and you want to commit the changes
session.merge(item)
# commit changes
session.commit()
Alterantively你不需要.all()并且遍历查询对象也会执行它
sql_query = session.query(Animal.fmri_measurements).filter(Animal.id_eth == 1)
for item in sql_query:
#do something
要获得pandas数据帧,您可以运行:
mystring = str(session.query(Weight))
print pd.read_sql_query(mystring,engine)