gpt4 book ai didi

Python:根据执行前的列表长度附加到mysql命令?

转载 作者:行者123 更新时间:2023-11-30 00:35:31 25 4
gpt4 key购买 nike

我想在执行之前将条件子句附加到 mysql 命令,该命令将根据我想要从数据库中提取的元素数量而变化。

例如,我有大量基因列表,对于每个感兴趣的基因,我都有所有外显子的坐标。

Gene_ID 外显子开始结束

基因A外显子1 325 359

基因A外显子2 554 601

geneB 外显子 1 870 900

基因B外显子2 990 1010

基因B外显子3 1200 1350

如您所见,基因 A 有 2 个外显子,基因 B 有 3 个外显子。我想执行如下命令以返回外显子坐标内数据库中所有元素的计数。

select count(*) from db_x where position between exon1_start and exon1_end and position between exon2_start and exon2_end;

由于每个基因中的外显子数量不同(有些基因可以包含数十个外显子),因此在执行整个外显子之前,我需要为每个外显子附加一个额外的“exon_end和exon_start之间的位置”条件语句命令。

我正在努力想出一个合理的解决方案。目前,对于每个基因,我将一个串联的 start_end 位置列表传递给一个函数,然后该函数查询 mysql 服务器。例如对于geneA ['325..359','554..601']

我正在使用的命令(设置光标后)如下;

cur.execute('select count(*) from db_x where position between '+str(exon1_start)+' and '+str(exon1_end)+' and position between +'str(exon2_start)+' and '+str(exon2_end))

如果只有 1 个或两个外显子,那就没问题,但我如何处理可能很长的外显子列表?如何在执行之前动态重新格式化命令?

非常感谢一些帮助,因为我很困惑!

最佳答案

您可以动态构建一个存储外显子数据的字典,并基于该字典构建 SQL 查询:

gene_exons_dict = dict()


def add_exon_to_gene(gene_name,gene_exon):
if gene_name not in gene_exons_dict:
gene_exons_dict[gene_name] = []

tmp_exons_dict = {'start': gene_exon[0], 'end': gene_exon[1]}
gene_exons_dict[gene_name].append(tmp_exons_dict)


def get_sql_query_for_gene(gene_name):
if gene_name not in gene_exons_dict:
raise Exception("exons not defined for gene: %s" % gene_name)

sql_query = 'select count(*) from db_x.tb_y WHERE '
exons_count = len(gene_exons_dict[gene_name])
for exon_data in gene_exons_dict[gene_name]:
sql_query += '(position >'+str(exon_data['start'])+' AND position <'+str(exon_data['end'])+')'
if exons_count > 1:
sql_query += ' AND ' # change it to OR if query should return sum of sets instead of their intersection

# removing last and for multi-exons case
if exons_count > 1:
sql_query=sql_query[:-5]

return sql_query

if __name__ == '__main__':

add_exon_to_gene('gene1', [1, 2])
add_exon_to_gene('gene1', [3, 8])
add_exon_to_gene('gene1', [10, 15])

add_exon_to_gene('gene2', [20, 25])

print get_sql_query_for_gene('gene1')
print get_sql_query_for_gene('gene2')

给出输出:

C:\tmp>python dynamicDictTest.py
select count(*) from db_x.tb_y WHERE (position >1 AND position <2) AND (position >3 AND position <8) AND (position >10 AND position <15)
select count(*) from db_x.tb_y WHERE (position >20 AND position <25)

关于Python:根据执行前的列表长度附加到mysql命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22216976/

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