【发布时间】:2013-03-31 17:49:49
【问题描述】:
编辑:我做了一个short question,因为我觉得这个太长了,对不起
首先,我是数据库、编程语言等方面的新手……很抱歉,如果这个问题不是那么恰当或具体,任何帮助或指导将不胜感激……
我正在使用的上下文如下:我正在通过其 API 查询现有数据库,以便检索某些信息来设计我自己的数据库。
创建此数据库的目的是例如让用户引入一个基因以了解它在生物体中的哪个位置过度(UP)或低于(DOWN)表达,以及在哪个实验中看到了这种类型的表达。
目前,我正在做的只是查询现有数据库并解析 json 结果以获取每个有机体部分,所有过度或不足表达的基因(以及我获得的每个基因)已报告该类型表达的实验)
(在大脑中)
基因1
Experiment1 UP
Experiment2 UP
Experiment3 UP
Experiment4 DOWN
基因2
Experiment5 DOWN
Experiment2 DOWN
Experiment3 DOWN
Experiment8 UP
Experiment9 DOWN
我认为我需要的不同表格是:“genes”、“organs”、“experiments”和“type of expression”(以及“genes2experiments2organs”)
考虑到一个基因可以在多个有机体_part中表达,并且可以具有与多个实验相关的不同类型的表达,并且一个实验可以包含多个基因(多对多关系)
我首先想知道的是如何添加关系数据,并知道我的尝试是否朝着正确的方向发展,或者我应该改变数据库的架构/想法......
我的第一次尝试是这样的:
###########################################
DATABASE DEFINITION
###########################################
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()
Genes2experiments2organs = Table('genes2experiments2organs',Base.metadata,
Column('gene_id', String, ForeignKey('genes.id')),
Column('experiment_id', String, ForeignKey('experiments.id')),
Column('organ_id', String, ForeignKey('organs.id'))
)
class Genes(Base):
__tablename__ = 'genes'
id = Column(String(45), primary_key=True)
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)
experiments = relationship("Experiments", secondary=Genes2experiments2organs, backref="genes")
organs = relationship("Organs", secondary=Genes2experiments2organs, backref="genes")
def __init__(self, id=""):
self.id= id
def __repr__(self):
return "<experiments(id:'%s')>" % (self.id)
class Organs(Base):
__tablename__ = 'organs'
id = Column(String(45), primary_key=True)
def __init__(self, id=""):
self.id= id
def __repr__(self):
return "<organs(id:'%s')>" % (self.id)
class Expression_type(Base):
__tablename__ = 'expression_type'
id = Column(String(45), primary_key=True)
def __init__(self, id=""):
self.id= id
def __repr__(self):
return "<expression_type(id:'%s')>" % (self.id)
#####################################################
INSERTING DATA
#####################################################
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(): ## I am just adding genes without taking into account the other related data to these genes.....
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()
session=Session()
genes=session.query(Genes).all()
print "List of genes introduced:"
for gene in genes:
print gene.id
session.close()
所以,使用这段代码,我只是填充“基因”表,但没有考虑与其他数据存在的关系,我必须包含在数据库中......做这样的事情的过程是什么,添加关系数据?还有一种避免插入重复基因的方法,例如在通过 API 查询填充表时?
顺便说一句,正如您所见,我没有将所有多对多关系(次要)放在“基因”表中,因为我不确定我是正确还是完全错误...谢谢
【问题讨论】:
-
嘿,你认为我应该缩短这个问题只是编辑这个问题还是创建一个新问题??
-
对于那些想看json字符串结构的人。 curl "ebi.ac.uk/gxa/api/…" | python -m json.tool
标签: python api sqlalchemy database-schema python-requests