Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:根据执行前的列表长度追加到mysql命令?_Python_Mysql - Fatal编程技术网

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

Python:根据执行前的列表长度追加到mysql命令?,python,mysql,Python,Mysql,我想在执行之前将条件子句附加到mysql命令中,这将根据我想从DB中提取的元素数量而有所不同 例如,我有一个庞大的基因列表,对于每个感兴趣的基因,我有所有外显子的坐标 基因ID外显子起始端 geneA外显子1 325 359 geneA外显子2 554 601 基因B外显子1 870 900 geneB外显子2 990 1010 基因外显子3 1200 1350 你可以看到geneA有2个外显子,geneB有3个外显子。我想执行如下命令,以返回exons坐标内DB中所有元素的计数 select

我想在执行之前将条件子句附加到mysql命令中,这将根据我想从DB中提取的元素数量而有所不同

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

基因ID外显子起始端

geneA外显子1 325 359

geneA外显子2 554 601

基因B外显子1 870 900

geneB外显子2 990 1010

基因外显子3 1200 1350

你可以看到geneA有2个外显子,geneB有3个外显子。我想执行如下命令,以返回exons坐标内DB中所有元素的计数

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条件语句之间附加and位置

我正在努力想出一个合乎逻辑的解决方案。目前,对于每个基因,我将向一个查询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))
如果只有一两个外显子就可以了,但是我如何处理可能非常长的外显子列表呢?如何在执行之前动态地重新格式化命令


当我被难倒的时候,我真的很感激你的帮助

您可以动态构建一个存储外显子数据的字典,并基于该字典构建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)

sql语法即使在mysql命令行上也不适用于我。我可以使用select count*从db_x查询,其中位置介于1和2之间,但添加额外的和位置介于3和8之间的和位置介于10和15之间的,会导致语法错误。好的,我尚未验证该查询。刚刚实现了描述的行为以匹配您的示例。根据您的需要,您应该使用或和运算符连接零件。请看这里并相应地修改查询:当然中间部分应该修改为适当的WHERE语句。我更新了代码,但WHERE之后的整个条件集可能需要放在括号中。还不清楚您是否需要集合的和或交集,因此请更改sql\u query+='和'中的AND to或AND,如果这样做,还可以将sql\u query=sql\u query[:-5]更改为sql\u query=sql\u query[:-4]或短一个字母。您还缺少WHERE所需的表名。我在一个真正的MySQL数据库上进行了检查,发现查询是有效的。不知道我还能做些什么来帮助你。上例中的条件不相交,因此结果将为空,但如果使用OR运算符,则将得到由每个位置>X和位置