我正在尝试使用 pyodbc
将一个大表写入csv
fetchmany()
. 我可以正确连接,但唯一写入的记录是标头。 循环访问数据库游标的正确方法是什么?
cxn = pyodbc.connect(cxn data)
mssql_cursor = cxn.cursor()
mssql_cursor.execute(sql_query)
c = csv.writer(open('file.csv', 'w', encoding ='UTF-8', newline='n'), delimiter='|')
c.writerow([i[0] for i in mssql_cursor.description])
results = mssql_cursor.fetchmany(10000)
while results:
c.writerows(results)
results = mssql_cursor.fetchmany(10000)
mssql_cursor.close()
cxn.close()
编辑:看起来没有通过fetchmany
方法返回任何内容。 我添加了print(len(results))
,结果是 0。
我会保持简单,只是迭代:
cxn = pyodbc.connect(cxn data)
mssql_cursor = cxn.cursor()
rows = mssql_cursor.execute(sql_query)
with open('file.csv', 'w', encoding ='UTF-8', newline='n') as csvfile:
c = csv.writer(csvfile, delimeter='|')
for row in rows:
c.writerow(row)
mssql_cursor.close()
cxn.close()
这行得通吗?如果它在这里工作并且您想切换到 executemany()
,修改应该相当容易。
测试表明,至少部分问题源于与csv.writer
关联的file
对象的处理。使用上下文管理器(with
块)显式处理file
似乎已经为我解决了问题:
with open('file.csv', 'w', encoding ='UTF-8', newline='n') as csvfile:
c = csv.writer(csvfile, delimiter='|')
c.writerow([i[0] for i in mssql_cursor.description])
results = mssql_cursor.fetchmany(10000)
while results:
c.writerows(results)
results = mssql_cursor.fetchmany(10000)