Курсор Pickle и 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

Я предполагаю, что pickle не полностью поддерживает объекты pypyodbc. Что может быть обходным путем?


person user1700890    schedule 01.11.2015    source источник
comment
Может query_list = list(cur.fetchall())...?   -  person Gord Thompson    schedule 02.11.2015
comment
Все еще не повезло, плюс я нашел stackoverflow.com /вопросы/17861152/   -  person user1700890    schedule 02.11.2015


Ответы (1)


Мне удалось воссоздать проблему с помощью 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()
person Gord Thompson    schedule 02.11.2015
comment
pyodbc больше не поддерживается, плюс pypyodbc является родным для python. Спасибо за ваш ответ! - person user1700890; 06.11.2015