2017-01-12 13 views
1

csvに大きなテーブルを書き込もうとしています。pyodbcを使用してfetchmany()を使用しています。私は正しく接続することができますが、書き込まれる唯一のレコードはヘッダーです。 dbカーソルをループする正しい方法は何ですか?PYODBC fetchmanyからcsvのみ出力ヘッダー

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

+0

は –

+0

@MoinuddinQuadri同じ結果に 'あなたを' c.writerows(リスト(結果を))してみてください依然としてフェッチされたオブジェクトを反復処理する必要があります。 – mikebmassey

+0

whileループ – Parfait

答えて

1

た:

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()に切り替える場合は、変更するのがかなり簡単です。

0

テストでは、問題の少なくとも一部が、csv.writerに関連付けられたfileオブジェクトの処理に起因することが示唆されています。明示的fileを処理するために、コンテキストマネージャ(withブロックを)私のために問題を解決しているようだ使い方:

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) 
関連する問題