2016-02-04 25 views
0

我在哪里存储鼠标的ID和FMRI测量会话,类数据库(具有大大降低的列,为方便起见)如下所示:从查询中选择链接的对象中的SQLAlchemy

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") 

我想创建一个熊猫数据框,以获得分配给某个特定动物的所有FMRIMeasure的所有细节。从动物中选择数据正常工作:

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的错,但我找不到任何事情来帮助我与我的使用情况下,在文档(或许,我不知道该怎么wthat我想要做的实际上是调用): -/

回答

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你不需要的。所有(),并通过查询对象迭代将执行它,以及

sql_query = session.query(Animal.fmri_measurements).filter(Animal.id_eth == 1) 
for item in sql_query: 
    #do something 

为了再拿到熊猫数据框,你可以运行:

mystring = str(session.query(Weight)) 
print pd.read_sql_query(mystring,engine) 
+0

谢谢你答案。我其实有一个后续问题,但我认为它足够大,可以在单独的页面上更好地适应这里的评论。你能帮我吗? http://stackoverflow.com/questions/35208961/filter-query-by-linked-object-key-in-sqlalchemy基本上这个解决方案工作,如果列包含蜇,浮游物,Ints,但它不起作用,如果我想按相关对象过滤。 – TheChymera