Python脚本在执行长时间运行的查询时挂起,即使在查询完成之后也是如此

Python脚本在执行长时间运行的查询时挂起,即使在查询完成之后也是如此,python,postgresql,amazon-redshift,Python,Postgresql,Amazon Redshift,我有一个Python脚本,它在文件夹中循环,并在每个文件夹中对我们的红移集群执行sql文件(使用psycopg2)。下面是执行循环的代码(注意:对于执行只需几分钟的查询,这很好): execute_query是存储在另一个文件中的方法: def execute_query(self, source_path): conn_rs = psycopg2.connect(self.conn_string) cursor = conn_rs.cursor(cursor_factory=p

我有一个Python脚本,它在文件夹中循环,并在每个文件夹中对我们的红移集群执行sql文件(使用psycopg2)。下面是执行循环的代码(注意:对于执行只需几分钟的查询,这很好):

execute_query是存储在另一个文件中的方法:

def execute_query(self, source_path):
    conn_rs = psycopg2.connect(self.conn_string)
    cursor = conn_rs.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
    sql_file = self.read_sql_file(source_path)
    cursor.execute(sql_file)
    records = cursor.fetchall()
    conn_rs.commit()
    return pd.DataFrame(data=records)

def read_sql_file(self, path):
    sql_path = path
    f = open(sql_path, 'r')
    return f.read()
我有几个查询执行起来大约需要15分钟(考虑到红移集群中数据的大小,这并不罕见),它们在SQL Workbench中执行得很好。我可以在AWS控制台中看到查询已完成,但脚本只是挂起,不会将结果转储到csv文件,也不会继续处理文件夹中的下一个文件


我没有指定任何超时。还有什么我遗漏的吗?

records=cursor.fetchall()
可能是罪魁祸首。它读取所有数据,从而将查询中的所有结果加载到内存中。由于您的查询非常大,这些数据可能无法一次全部加载到内存中

您应该迭代光标的结果,并逐个写入csv。通常,试图一次读取数据库查询中的所有数据不是一个好主意

为此,您需要重构代码:

for record in cursor:
    csv_fh.write(record)

其中
csv\u fh
是csv文件的文件句柄。您使用的
pd.DataFrame
需要重新编写,因为它似乎希望所有数据都传递给它。

我会在脚本中添加一些调试日志,以查看它实际挂起的位置。
for record in cursor:
    csv_fh.write(record)