在 python 中创建临时 table 以加入 sql table
Create a temporary table in python to join with a sql table
我在 vertica 数据库中有以下数据,Mytable
:
+----+-------+
| ID | Value |
+----+-------+
| A | 5 |
| B | 9 |
| C | 10 |
| D | 7 |
+----+-------+
我正在尝试在 python 中创建查询以访问 Vertica 数据库。在 python 我有一个列表:
ID_list= ['A', 'C']
我想创建一个查询,基本上将 Mytable
与 ID_list
进行内部联接,然后我可以进行 WHERE
查询。
所以它基本上是这样的
SELECT *
FROM Mytable
INNER JOIN ID_list
ON Mytable.ID = ID_list as temp_table
WHERE Value = 5
我没有数据库的写入权限,所以 table 需要在本地创建。还是有其他方法可以做到这一点?
所以我使用了 Tim 的方法:
# 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"
运行速度惊人
如果您的 table 很小,那么您可以按照 Tim 的建议创建一个收件人列表。
不过,我更喜欢使用 python 方式来做到这一点。我可能还会将 ID_list 设为 set
以防止重复等
in_list = '(%s)' % ','.join(str(id) for id in ID_list)
或更好地使用绑定变量(取决于您使用的客户端,如果您正在处理一组整数,则可能不是绝对必要的,因为我无法想象用它注入 sql 的方法):
in_list = '(%s)' % ','.join(['%d'] * len(ID_list)
并将您的 ID_list 作为参数列表发送给您的 cursor.execute
。此方法是位置性的,因此您需要正确安排绑定参数。
如果您有一个非常非常大的列表...您可以创建一个本地临时文件并在使用 join 进行查询之前加载它。
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`
然后加入我的table。
我不会费心做后者,行数很少,开销太大。
我在 vertica 数据库中有以下数据,Mytable
:
+----+-------+
| ID | Value |
+----+-------+
| A | 5 |
| B | 9 |
| C | 10 |
| D | 7 |
+----+-------+
我正在尝试在 python 中创建查询以访问 Vertica 数据库。在 python 我有一个列表:
ID_list= ['A', 'C']
我想创建一个查询,基本上将 Mytable
与 ID_list
进行内部联接,然后我可以进行 WHERE
查询。
所以它基本上是这样的
SELECT *
FROM Mytable
INNER JOIN ID_list
ON Mytable.ID = ID_list as temp_table
WHERE Value = 5
我没有数据库的写入权限,所以 table 需要在本地创建。还是有其他方法可以做到这一点?
所以我使用了 Tim 的方法:
# 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"
运行速度惊人
如果您的 table 很小,那么您可以按照 Tim 的建议创建一个收件人列表。
不过,我更喜欢使用 python 方式来做到这一点。我可能还会将 ID_list 设为 set
以防止重复等
in_list = '(%s)' % ','.join(str(id) for id in ID_list)
或更好地使用绑定变量(取决于您使用的客户端,如果您正在处理一组整数,则可能不是绝对必要的,因为我无法想象用它注入 sql 的方法):
in_list = '(%s)' % ','.join(['%d'] * len(ID_list)
并将您的 ID_list 作为参数列表发送给您的 cursor.execute
。此方法是位置性的,因此您需要正确安排绑定参数。
如果您有一个非常非常大的列表...您可以创建一个本地临时文件并在使用 join 进行查询之前加载它。
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`
然后加入我的table。
我不会费心做后者,行数很少,开销太大。