Python:将大型 SQL Server 查询结果导出到 .txt 文件

Posted

技术标签:

【中文标题】Python:将大型 SQL Server 查询结果导出到 .txt 文件【英文标题】:Python: Export Large SQL Server Query Result to .txt File 【发布时间】:2018-04-07 03:01:25 【问题描述】:

将> 600,000,000 行的SQL Server 查询结果复制到本地.txt 文件的最高效和内存效率最高的方法是什么?您可能会认为我没有从 SQL Server Management Studio 导出的用户权限。因此,Python 似乎是我最好的选择。

我目前正在使用 Python pyodbc 包:

connection = pyodbc.connect('Driver=DRIVER;' \
                            'Server=SERVER;' \
                            'Database=DATABASE;' \
                            'uid=USERNAME;' \
                            'pwd=PASSWORD')

cursor = connection.cursor()
try:
    cursor.execute("SELECT * FROM %s" % table)
except:
    print('===== WAITING ===== EXECUTE ERROR =====')
    time.sleep(15)
    cursor.execute("SELECT * FROM %s" % table)

try:
    data = cursor.fetchall()
except:
    print('===== WAITING ===== FETCH ERROR =====')
    time.sleep(15)
    data = cursor.fetchall()

with open(output_file, 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f, delimiter=delimiter)
    writer.writerow([x[0] for x in cursor.description])  # column headers
    for row in data:
        writer.writerow(row)
cursor.close()

旁注:我的目标是将数百个 SQL 表作为 .txt 文件传输到 Amazon S3 存储桶。有没有更好的方法来做到这一点,而不是将文件下载到本地驱动器然后上传到 S3?

【问题讨论】:

你试过bcp吗? 【参考方案1】:

这取决于结果集,但作为一般规则,我会使用 fetchmany 一次抓取一堆行,而不是将所有内容都拉入内存:

fetch_rows = 1000
rows = cursor.fetchmany(fetch_rows)
while rows is not None:
    for row in rows:
        do_something()
    rows = cursor.fetchmany(fetch_rows)

祝你好运!

【讨论】:

以上是关于Python:将大型 SQL Server 查询结果导出到 .txt 文件的主要内容,如果未能解决你的问题,请参考以下文章

大型sql server查询性能优化

SQL Server 查询以计算每日“持仓”未结订单

调整SQL Server中的大型查询

SQL Server 中对大型数据集的慢速不同查询

提高大型表上的 SQL Server 查询性能

在 SQL Server 中调整大型查询