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 只有您需要的列。
这已经被难住了一天多了,我能找到的例子都没有用。我是 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 只有您需要的列。