2017-01-12 4 views
1

csv에 큰 테이블을 쓰려고하는데 pyodbc을 사용하여 fetchmany()을 사용하고 있습니다. 올바르게 연결할 수 있지만 기록되는 유일한 레코드는 헤더입니다. db 커서를 루프하는 올바른 방법은 무엇입니까?PYODBC Fetchmany to csv only header

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

하는'에서 c.writerows (목록 (결과를))'시도하는 동안 루프 –

+0

@MoinuddinQuadri 같은 결과 – mikebmassey

+0

당신 여전히 페치 된 객체를 반복해야 할 수도 있습니다. – 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)