2015-11-01 57 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