从SQLAlchemy中的Query中选择链接对象

时间:2016-02-04 13:49:02

标签: python sqlite pandas sqlalchemy

我有一个数据库,用于存储鼠标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,但是我找不到任何东西可以帮助我处理文档中的用例(也许我不知道我想要做的事情实际上是如何调用的): - /

1 个答案:

答案 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)