sqlalchemy:使用别名从多个连接中选择特定列

时间:2015-07-08 11:54:19

标签: sql python-2.7 sqlalchemy inner-join

这已经被困了一天以上,我找到的例子都没有用。我是SQLALCHEMY的新手,我觉得这些文档不是很有启发性。

查询(到目前为止):

prey = alias(ensembl_genes, name='prey')
bait = alias(ensembl_genes, name='bait')
query = db.session.query(tap,prey,bait).\
    join(prey, tap.c.TAP_PREY_ENSEMBL_GENE_ID==prey.c.ENSEMBL_GENE_ID).\
    join(bait, tap.c.TAP_BAIT_ENSEMBL_GENE_ID==bait.c.ENSEMBL_GENE_ID).\
    filter(\
      or_(\
        tap.c.TAP_PREY_ENSEMBL_GENE_ID=='ENSG00000100360',\
        tap.c.TAP_BAIT_ENSEMBL_GENE_ID=='ENSG00000100360'\
      )\
    ).\
    order_by(desc(tap.c.TAP_UNIQUE_PEPTIDE_COUNT))

tap是指相互作用基因的表格。一个交互者被称为“诱饵”而另一个被称为“猎物”。猎物和诱饵是同一个表的别名,其中包含有关这些基因的其他信息。目标是选择与给定基因'ENSG00000100360'的所有相互作用作为诱饵或猎物。

问题:

这个查询返回大约20个左右的列,但我只需要六个特定的列,每个原始表中有两个(我也想重命名它们)。从interwebz上的例子我想我应该补充:

  options(
      Load(tap).load_only('TAP_UNIQUE_PEPTIDE_COUNT','TAP_SEQUENCE_COVERAGE'),
      Load(prey).load_only('ENSEMBL_GENE_SYMBOL','ENSEMBL_GENE_ID'),
      Load(bait).load_only('ENSEMBL_GENE_SYMBOL','ENSEMBL_GENE_ID')
    )

但是这给了我以下错误:

  

文件“/Users/jvandam/Github/syscilia/tools/BDT/quest/blueprints/genereport.py”,第246行,在createTAPMSView中       负载(抽头).load_only( 'TAP_UNIQUE_PEPTIDE_COUNT', 'TAP_SEQUENCE_COVERAGE')       在 init 中输入文件“/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/strategy_options.py”,第82行       self.path = insp._path_registry   AttributeError:'Table'对象没有属性'_path_registry'

我无法在谷歌上找到关于如何处理这件事的任何事情。 sqlalchemy表对象是从数据库表元数据中创建的。

我尝试使用sqlalchemy orm语句模拟的是:

SELECT
prey.ENSEMBL_GENE_SYMBOL AS PREY_ENSEMBL_GENE_SYMBOL,
prey.ENSEMBL_GENE_ID AS PREY_ENSEMBL_GENE_ID,
bait.ENSEMBL_GENE_SYMBOL AS BAIT_ENSEMBL_GENE_SYMBOL,
bait.ENSEMBL_GENE_ID AS BAIT_ENSEMBL_GENE_ID,
t.TAP_UNIQUE_PEPTIDE_COUNT AS UNIQUE_PEPTIDE_COUNT,
t.TAP_SEQUENCE_COVERAGE AS SEQUENCE_COVERAGE
FROM TAP as t
INNER JOIN ENSEMBL_GENES AS prey
  ON tap.TAP_PREY_ENSEMBL_GENE_ID=prey.ENSEMBL_GENE_ID
INNER JOIN ENSEMBL_GENES AS bait
  ON t.TAP_BAIT_ENSEMBL_GENE_ID=bait.ENSEMBL_GENE_ID
WHERE
  t.TAP_PREY_ENSEMBL_GENE_ID='ENSG00000100360' 
  OR t.TAP_BAIT_ENSEMBL_GENE_ID='ENSG00000100360'
ORDER BY t.TAP_UNIQUE_PEPTIDE_COUNT DESC

任何人都可以帮我修复我的查询吗? 提前致谢! 约翰

1 个答案:

答案 0 :(得分:8)

只需使用以下内容更改此部分db.session.query(tap,prey,bait).\

db.session.query(\
    prey.ENSEMBL_GENE_SYMBOL.label("PREY_ENSEMBL_GENE_SYMBOL"),
    prey.ENSEMBL_GENE_ID.label("PREY_ENSEMBL_GENE_ID"),
    bait.ENSEMBL_GENE_SYMBOL.label("BAIT_ENSEMBL_GENE_SYMBOL"),
    bait.ENSEMBL_GENE_ID.label("BAIT_ENSEMBL_GENE_ID"),
    tap.TAP_UNIQUE_PEPTIDE_COUNT.label("UNIQUE_PEPTIDE_COUNT"),
    tap.TAP_SEQUENCE_COVERAGE.label("SEQUENCE_COVERAGE"),
).\
select_from(tap).\  # @note: need this in so that FROM and JOINs are in desired order

这将只选择您需要的列。