我目前正在使用MySQL Connector / Python来查询数据库。
目前,我正在做的其中一个过程看起来像这样:
SELECT some_column FROM some_table WHERE some_column_2 = foo_1;
SELECT some_column FROM some_table WHERE some_column_2 = foo_2;
SELECT some_column FROM some_table WHERE some_column_2 = foo_3;
...
SELECT some_column FROM some_table WHERE some_column_2 = foo_9999;
SELECT some_column FROM some_table WHERE some_column_2 = foo_10000;
我正在运行大量非常相似的查询。
每个查询的单个结果都很重要。即使给定的查询没有产生任何结果。
不幸的是,目前制作数千个查询的方法耗费时间且效率极低。
所以,我的问题是:有没有办法将这个程序压缩成一个查询,以便它更有效地运行?
我觉得这绝对可以在MySQL中使用,而且我很确定这里有一些我不知道的东西。
到目前为止,我已尝试使用MySQL Connector / Python的executemany()函数,如下所示:
cursor.executemany("SELECT some_column FROM some_table WHERE some_column_2 = %s", foo_list)
我希望这会为每个单独的查询生成结果列表,但会优化尽可能多的查询。不幸的是,这似乎不适用于MySQL Connector / Python,并导致语法错误。
我猜测executemany并不适用于SELECT语句,只能用于INSERT语句。
我还在互联网上搜索了批量选择查询的方法,但我还没有找到与我的情况相关的任何内容。
我想明确指出
SELECT some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, foo_3, etc);
不是一个有效的解决方案,因为它不会保留每个查询的结果(或缺少结果)。
欢迎任何协助。
答案 0 :(得分:1)
而不是
SELECT some_column FROM some_table WHERE some_column_2 IN(foo_1,foo_2,...,foo_N);
只是要求
SELECT some_column, some_column_2 FROM some_table WHERE some_column_2 IN (foo_1, foo_2, ..., foo_N);
生成查询的代码知道foo 1..N值,并会在第2列结果中看到它们的一部分。
作为一个单独的问题,使用IN
通常是一种反模式,它会干扰mysql优化器创建好计划的能力。对于一个较大的IN
子句,您可能会发现最好不要填充FOO
表并加入其中。
答案 1 :(得分:0)
我接受了J H的回答,因为它提供了我正在寻找的信息。但是,我也会将其作为他们建议的具体实现发布:
cursor.execute("CREATE TABLE foo_table (foo VARCHAR(20))")
insert_query = "INSERT INTO foo_table (foo) VALUES (%s)"
cursor.executemany(insert_query, foo_list)
select_query = "SELECT some_table.some_column FROM some_table RIGHT JOIN foo_table on some_table.foo = foo_table.foo GROUP BY 1"
cursor.execute(select_query)
这似乎按预期工作。
编辑:因为由于某种原因,python MySQL Connector / Python中的游标对象将简单地省略" null"值,仍然需要配对" some_column"和" foo"值。因为,就我而言,每个" some_column"价值总是完全独特的每一个" foo"值,我可以使用ANY_VALUE()来做到这一点。