Как изменить тип возвращаемого значения datetime.time на строку под pyodbc?

Я переместил кодовую базу для большого существующего проекта Python 2 из pymssql в pyodbc, Перемещение было простым, все собирается и работает нормально, за исключением того, что pyodbc возвращает столбцы SQL Server типа time в виде datetime.timeгде pymssql (а также собственные драйверы PostgreSQL) возвращают строки.

Смысл, я получаю datetime.time(11, 54, 13, 161000) объект вместо 11:54:13.161000, Есть ли способ, которым я могу изменить это поведение глобально, не прибегая к какой-либо хранимой процедуре? Обработка возвращенного объекта вместо возвращенной строки потребует нескольких дней рефакторинга и тестирования.

1 ответ

Решение

Вы можете использовать функцию Конвертер вывода pyodbc для захвата значений ВРЕМЕНИ, возвращаемых SQL Server, и форматирования их в виде строк.

До:

import pyodbc

cnxn = pyodbc.connect('DSN=SQLmyDb;', autocommit=True)
crsr = cnxn.cursor()

rtn = crsr.execute("SELECT CAST('11:54:13.161' AS TIME)").fetchval()
print(repr(rtn))  # datetime.time(11, 54, 13, 161000)

crsr.close()
cnxn.close()

После:

import pyodbc
import struct


def time_as_string(raw_bytes):
    tup = struct.unpack("<4hI", raw_bytes)  # e.g., (11, 54, 13, 0, 161000000)
    tweaked = [tup[i] // 100 if i == 4 else tup[i] for i in [0, 1, 2, 4]]
    return "{:02d}:{:02d}:{:02d}.{:07d}".format(*tweaked)


cnxn = pyodbc.connect('DSN=SQLmyDb;', autocommit=True)
cnxn.add_output_converter(pyodbc.SQL_SS_TIME2, time_as_string)
crsr = cnxn.cursor()

rtn = crsr.execute("SELECT CAST('11:54:13.161' AS TIME)").fetchval()
print(repr(rtn))  # '11:54:13.1610000'

crsr.close()
cnxn.close()
Другие вопросы по тегам