2015-11-01 56 views
1

我想序列化查詢的結果。這是我的例子:泡椒和pypyodbc遊標

import pypyodbc 
import pickle 

connection_string ='Driver={SQL Server Native Client 11.0};Server=localhost;' \ 
         'Database=someDB;Uid=someLogin;Pwd=somePassword;' 
connection = pypyodbc.connect(connection_string) 
sql_query = "SELECT * FROM SomeTable" 
cur = connection.cursor() 
cur.execute(sql_query) 
query_list = list(cur) 

with open(r'D:\query_result', 'wb') as f: 
    pickle.dump(query_list, f) 
cur.close() 
connection.close() 

它生成以下錯誤:

_pickle.PicklingError: Can't pickle <class 'pypyodbc.TupleRow.<locals>.Row'>: 
attribute lookup Row on pypyodbc failed 

我猜鹹菜不完全支持pypyodbc對象。什麼是解決方法?

+0

也許'QUERY_LIST =名單(cur.fetchall())'...? –

+0

仍然沒有運氣,再加上我發現http://python.com/downloads/17861152/cursor-fetchall-vs-listcursor-in-python – user1700890

回答

2

我能夠重新使用pypyodbc的問題,而同樣的代碼似乎與pyodbc工作正常。對於pypyodbc一個可能的解決方法可能是轉換的結果字典對象的列表,然後序列化:

import pickle, pypyodbc 
connection_string = (
    r"Driver={SQL Server Native Client 10.0};" 
    r"Server=(local)\SQLEXPRESS;" 
    r"Database=myDb;" 
    r"Trusted_connection=yes;" 
) 
connection = pypyodbc.connect(connection_string) 
cur = connection.cursor() 
cur.execute("SELECT * FROM Donors") 

column_names = [x[0] for x in cur.description] 
query_list = [dict(zip(column_names, row)) for row in cur.fetchall()] 

with open(r'C:\Users\Gord\Desktop\query_result', 'wb') as f: 
    pickle.dump(query_list, f) 
cur.close() 
connection.close() 
+0

pyodbc是不長的支持,再加上pypyodbc是python原生。謝謝您的回答! – user1700890