sqlalchemy:select 来自使用别名的多个连接的特定列

sqlalchemy: select specific columns from multiple join using aliases

这已经被难住了一天多了,我能找到的例子都没有用。我是 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 指的是 table 相互作用的基因。一个交互器被指定为 'bait',另一个被指定为 'prey'。 Prey 和 Bait 是同一个 table 的别名,它包含关于这些基因的额外信息。 objective 是 select 与给定基因 'ENSG00000100360' 的所有相互作用作为诱饵或猎物。

问题:

此查询 returns 大约有 20 列左右,但我只需要六个特定的列,每个原始 table 列中有两个(我也想重命名它们)。根据在 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')
    )

但这给了我以下错误:

File "/Users/jvandam/Github/syscilia/tools/BDT/quest/blueprints/genereport.py", line 246, in createTAPMSView Load(tap).load_only('TAP_UNIQUE_PEPTIDE_COUNT','TAP_SEQUENCE_COVERAGE') File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/orm/strategy_options.py", line 82, in init self.path = insp._path_registry AttributeError: 'Table' object has no attribute '_path_registry'

我无法在 google 上找到任何有关如何处理此问题的信息。 sqlalchemy table 对象是从数据库 table 元数据创建的。

我试图使用 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

谁能帮我解决我的问题? 提前致谢! 约翰

只需将此部分 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

这将 select 只有您需要的列。