繁体   English   中英

在python中创建一个临时表以与sql表连接

[英]Create a temporary table in python to join with a sql table

我在Mytable db中有以下数据: Mytable

+----+-------+
| ID | Value |
+----+-------+
| A  |     5 |
| B  |     9 |
| C  |    10 |
| D  |     7 |
+----+-------+

我试图在python中创建一个查询来访问vertica数据库。 在python中我有一个列表:

ID_list= ['A', 'C']

我想创建一个基本上内部连接MytableID_list的查询,然后我可以进行WHERE查询。 所以它基本上就是这样的

SELECT *
FROM Mytable
INNER JOIN ID_list
    ON Mytable.ID = ID_list as temp_table
WHERE Value = 5

我对数据库没有写权限,因此需要在localy中创建表。 或者有另一种方法吗?

如果您有一个小桌子,那么您可以像Tim建议的那样创建并创建一个列表。

不过,我更喜欢使用python方式。 我也可能会将ID_list set为一set以防止重复等。

in_list = '(%s)' % ','.join(str(id) for id in ID_list)

或者更好地使用绑定变量(取决于你正在使用的客户端,如果你正在处理一组int,可能不是绝对必要的,因为我无法想象用这种方式注入sql):

in_list = '(%s)' % ','.join(['%d'] * len(ID_list)

并将您的ID_list作为cursor.execute的参数列表发送。 此方法是位置的,因此您需要正确排列绑定参数。

如果你有一个非常非常大的列表......你可以创建一个本地临时文件并在加入查询之前加载它。

CREATE LOCAL TEMP TABLE mytable ( id INTEGER );

COPY mytable FROM STDIN;
-- Or however you need to load the data. Using python, you'll probably need to stream in a list using `cursor.copy`

然后加入mytable。

我不打算用很少的行来做后者,而且开销太多了。

所以我使用蒂姆的方法:

# create a String of all the ID_list so they can be inserted into a SQL query
Sql_string='(';
for ss in ID_list:
    Sql_string= Sql_string + " " + str(ss) + ","
Sql_string=Sql_string[:-1] + ")"

"SELECT * FROM
(SELECT * FROM Mytable WHERE ID IN " + Sql_string) as temp 
Where Value = 5"

工作速度惊人

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM