Python 尝试在SQLite中按组合主键的长列表选择行

Python 尝试在SQLite中按组合主键的长列表选择行,python,sqlite,Python,Sqlite,这是我在浏览本网站时发现的代码查询: query="""SELECT Family FROM Table2 INNER JOIN Table1 ON Table1.idSequence=Table2.idSequence WHERE (Table1.Chromosome, Table1.hg19_coordinate) IN ({seq}) """.format(seq=','.join(['?']*len(matchIds_list))) match

这是我在浏览本网站时发现的代码查询:

query="""SELECT Family
           FROM Table2
     INNER JOIN Table1 ON Table1.idSequence=Table2.idSequence
     WHERE (Table1.Chromosome, Table1.hg19_coordinate) IN ({seq})
""".format(seq=','.join(['?']*len(matchIds_list)))
matchIds_list是一个元组列表,位于?,?格式


如果我只要求一个条件,也就是表1,它就可以工作。相对于Chrome和hg_坐标,MatchId_列表只是一个简单的单值列表,但我不知道如何让它与复合键或两列一起工作。

因为您运行的是SQLite 3.7.17,我建议只使用一个临时表

cursor.executescript("""
    CREATE TEMP TABLE control_list (
        Chromosome TEXT NOT NULL,
        hg19_coordinate TEXT NOT NULL
    );

    CREATE INDEX control_list_idx ON control_list (Chromosome, hg19_coordinate);
""")

cursor.executemany("""
    INSERT INTO control_list (Chromosome, hg19_coordinate)
    VALUES (?, ?)
""", matchIds_list)
创建并填充临时表

cursor.executescript("""
    CREATE TEMP TABLE control_list (
        Chromosome TEXT NOT NULL,
        hg19_coordinate TEXT NOT NULL
    );

    CREATE INDEX control_list_idx ON control_list (Chromosome, hg19_coordinate);
""")

cursor.executemany("""
    INSERT INTO control_list (Chromosome, hg19_coordinate)
    VALUES (?, ?)
""", matchIds_list)
只需将查询约束到控制列表临时表

cursor.executescript("""
    CREATE TEMP TABLE control_list (
        Chromosome TEXT NOT NULL,
        hg19_coordinate TEXT NOT NULL
    );

    CREATE INDEX control_list_idx ON control_list (Chromosome, hg19_coordinate);
""")

cursor.executemany("""
    INSERT INTO control_list (Chromosome, hg19_coordinate)
    VALUES (?, ?)
""", matchIds_list)
选择族 来自表2 内连接表1 在Table1.idSequence=Table2.idSequence上 -约束到控制列表。 哪里有 挑选* 从控制列表 其中control_list.chromose=表1.chromose 和控制列表.hg19\u坐标=表1.hg19\u坐标 最后执行查询,不需要格式化这个查询

cursor.execute(query)

# Remove the temporary table since we're done with it.
cursor.execute("""
    DROP TABLE control_list;
""")
短查询需要SQLite 3.15:实际上您几乎已经拥有了它。您需要在{seq}中创建子查询 表情

选择族 来自表2 内连接表1 在Table1.idSequence=Table2.idSequence上 其中表1.染色体,表1.hg19_坐标值{seq}; 长查询需要SQLite 3.8.3:它看起来有点复杂,但非常简单。把你的 控件列表转换为子选择,然后通过控件约束该主选择 名单

选择族 来自表2 内连接表1 在Table1.idSequence=Table2.idSequence上 -约束到控制列表。 哪里有 挑选* 从…起 选择 -名称列必须与元组中的顺序匹配。 作为染色体, :1作为hg19_坐标 从…起 -获取控制列表。 值{seq} 作为控制值 作为控制列表 -将表1约束到控制列表。 其中control_list.chromose=表1.chromose 和控制列表.hg19\u坐标=表1.hg19\u坐标 无论使用哪种查询,在格式化SQL时,将{seq}替换为?,?对于每个compsite 钥匙而不是仅仅

最后在执行查询时展平MatchID_列表,因为它是元组列表

import itertools
cursor.execute(query, list(itertools.chain.from_iterable(matchIds_list)))

谢谢你的快速回复!我试图测试一个更简单的查询,但不明白为什么连这个都不起作用sqlite>SELECT Family FROM Table2 INNER JOIN Table1 ON Table1.idSequence=Table2.idSequence其中Table1.chrome,Table1.hg19_坐标在'1','102568923','1','12333567';我尝试了您提供的代码,但它给了我一个错误:回溯最近的调用last:File/home/nchuang/MyTools/test\u database/test\u database.py,第183行,在c.executequery中,listitertools.chain.from\u iterablematchIds\u list sqlite3.OperationalError:near VALUES:syntax error。刚刚看到你的编辑。我会检查的。我尝试了长查询和短查询。对于我的简短查询,我还更新了我的联接以包括“?,?”?,?并将列表展平。它给了我一个sqlite3.ERROR:near,:语法error@nchuang你知道你正在运行哪个版本的SQLite吗?您可以使用SELECT sqlite_version查询它。我使用的sqlite3库是3.7.17。顺便说一句,添加值使我的第一条评论生效!所以你给我的简短询问肯定有用。我不明白这里有什么不同。不鼓励像这样构建SQL。他在用什么?用于参数化查询的。这是正确的方法。