使用Python中的API查询在SQL Alchemy中插入关系数据

时间:2013-04-09 13:05:16

标签: python json api sqlalchemy python-requests

也许我之前的问题太长而且无穷无尽地回答,对不起......我会尝试更具体地缩短我之前的问题

我可以从API查询(json格式作为输出)中提取以下信息:

基因1

Experiment1     
Experiment2     
Experiment3     
Experiment4     

基因2

Experiment5     
Experiment2     
Experiment3     
Experiment8     
Experiment9     
  

[...]

因此,我获得了基因及其相关实验,其中一个基因可以进行一个以上的实验,一个实验可以有一个以上的基因(多个到多个)

我在SQL Alchemy中有这个架构:

from sqlalchemy import create_engine, Column, Integer, String, Date, ForeignKey, Table, Float
from sqlalchemy.orm import sessionmaker, relationship, backref
from sqlalchemy.ext.declarative import declarative_base
import requests

Base = declarative_base()

Genes2experiments = Table('genes2experiments',Base.metadata,                                                                                                                                                                                                     
  Column('gene_id', String, ForeignKey('genes.id')),                                                                                                                                                                                                       
  Column('experiment_id', String, ForeignKey('experiments.id'))
)

class Genes(Base):
    __tablename__ = 'genes'
    id = Column(String(45), primary_key=True)
    experiments = relationship("Experiments", secondary=Genes2experiments, backref="genes")
    def __init__(self, id=""):
        self.id= id
    def __repr__(self):
        return "<genes(id:'%s')>" % (self.id)

class Experiments(Base):
    __tablename__ = 'experiments'
    id = Column(String(45), primary_key=True)
    def __init__(self, id=""):
        self.id= id
    def __repr__(self):
        return "<experiments(id:'%s')>" % (self.id)

def setUp():
    global Session
    engine=create_engine('mysql://root:password@localhost/db_name?charset=utf8', pool_recycle=3600,echo=False)
    Session=sessionmaker(bind=engine)

def add_data():   
    session=Session()
    for i in range(0,1000,200):
        request= requests.get('http://www.ebi.ac.uk/gxa/api/v1',params={"updownInOrganism_part":"brain","rows":200,"start":i})
        result = request.json
        for item in result['results']:
            gene_to_add = item['gene']['ensemblGeneId']            
    session.commit()
    session.close()       


setUp()
add_data()

使用此代码,我只需将API查询中的所有基因添加到Genes表...

第一个问题:我应该如何以及何时添加实验信息以保持他们的关系?

第二个问题:我应该在Experiments类中添加一个新的辅助关系,就像在Genes类中一样,还是仅仅放一个?

谢谢

(更多背景/信息:my previous question

1 个答案:

答案 0 :(得分:3)

  1. 每当您记录实验结果时,或者甚至在计划实验时,您都可以将实例添加到数据库以及关系中。

  2. backref有效地添加关系的另一面,以便拥有Experiments的实例,您可以通过my_experiment.genes

  3. 注意:我会从您的实体名称中移除复数:class Gene, class Experiment而不是class Genes, class Experiments