gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:59:21 24 4
gpt4 key购买 nike

这已经被难住了一天多,我能找到的例子没有奏效。我是 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 指的是一个相互作用的基因表。一个交互者被指定为“诱饵”,另一个被指定为“猎物”。 Prey 和 Bait 是同一个表的别名,该表包含有关这些基因的附加信息。目标是选择与给定基因“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')
)

但这给了我以下错误:

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'



我在谷歌上找不到任何关于如何处理的信息。
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

谁能帮我解决我的查询?
提前致谢!
约翰

最佳答案

只需更改这部分 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

这将仅选择您需要的列。

关于sqlalchemy:使用别名从多个连接中选择特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31291879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com