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。他在用什么?用于参数化查询的。这是正确的方法。