В настоящее время я использую приведенный ниже код для извлечения довольно большого набора данных из SQL Server в текстовый CSV-файл, который завершается с ошибкой, в зависимости от размера возвращаемых данных, с ошибкой памяти pandas.
Я читал, что, возможно, я смогу группировать заполнение кадра данных панд в куски, но я также читал, что метод read_sql_query по-прежнему загружает весь запрос в память, поэтому я не думаю, что это сработает.
Я не могу уменьшить объем данных, и мне нужно поддерживать "текст-квалификатор", но, поскольку я не делаю никаких дальнейших вычислений для набора данных, мне не нужно , чтобы использовать панд если есть лучший способ генерировать CSV.
и это мой вопрос: есть ли лучший способ выполнить потоковую передачу вывода хранимой процедуры с большим набором данных в файл CSV, при необходимости, пакетами?
мой код ниже:
import pyodbc
import pandas as pd
import csv
sql_connection_string = (f'DRIVER={{SQL Server}};'
f'SERVER=PATH\INSTANCE;'
f'DATABASE=DATABASE;'
f'Trusted_Connection=yes;')
sql = f'EXEC schema.stored_procedure_name @PARAM1=?, @PARAM2=?, @PARAM3=?'
params = (201812, 0, '')
with pyodbc.connect(sql_connection_string, autocommit=True) as conn:
with conn.cursor() as cursor:
cursor.execute(sql, params)
if cursor.arraysize > 0:
df = pd.DataFrame.from_records(cursor.fetchall(), columns=[x[0] for x in cursor.description])
df.to_csv(r'destination_path', index=False, quotechar='"', quoting=csv.QUOTE_ALL)