尝试在SQLite

时间:2018-03-28 13:54:56

标签: 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)))

matchIds_list是(?,?)格式的元组列表。

如果我只要求一个条件(即只Table1.Chromosome反对Chromosomehg_coordinate),它就有效,而matchIds_list只是一个简单的单值列表,但我不知道如何使用复合键或两列。

1 个答案:

答案 0 :(得分:1)

由于您正在运行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)

只需将查询约束到控制列表临时表。

SELECT Family
FROM Table2
INNER JOIN Table1
    ON Table1.idSequence = Table2.idSequence

-- Constrain to control_list.
WHERE EXISTS (
        SELECT *
        FROM control_list
        WHERE control_list.Chromosome = Table1.Chromosome
            AND control_list.hg19_coordinate = Table1.hg19_coordinate
    )

最后执行您的查询(无需格式化此查询)。

cursor.execute(query)

# Remove the temporary table since we're done with it.
cursor.execute("""
    DROP TABLE control_list;
""")

短查询(需要SQLite 3.15):你实际上几乎拥有它。您需要使IN ({seq})成为子查询 表达

SELECT Family
FROM Table2
INNER JOIN Table1
    ON Table1.idSequence = Table2.idSequence
WHERE (Table1.Chromosome, Table1.hg19_coordinate) IN (VALUES {seq});

长查询(需要SQLite 3.8.3):它看起来有点复杂,但它非常简单。把你的 将控制列表转换为子选择,然后通过控件约束主选择 列表。

SELECT Family
FROM Table2
INNER JOIN Table1
    ON Table1.idSequence = Table2.idSequence

-- Constrain to control_list.
WHERE EXISTS (
        SELECT *
        FROM (
            SELECT
                -- Name the columns (must match order in tuples).
                "" AS Chromosome,
                ":1" AS hg19_coordinate
            FROM (
                -- Get control list.
                VALUES {seq}
            ) AS control_values
        ) AS control_list
        -- Constrain Table1 to control_list.
        WHERE control_list.Chromosome = Table1.Chromosome
            AND control_list.hg19_coordinate = Table1.hg19_coordinate
    )

无论您使用哪个查询,在格式化SQL时,为每个组件替换{seq} (?,?) 键而不仅仅是?

query = " ... ".format(seq=','.join(['(?,?)']*len(matchIds_list)))

最后在执行查询时展平matchIds_list因为它是一个元组列表。

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