2015-11-01 2 views
1

Я хотел бы сериализовать результаты запроса. Вот мой пример:Pickle and pypyodbc cursor

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://stackoverflow.com/questions/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