pyodbc возвращает поля SQL Server DATE в виде строк - PullRequest
6 голосов
/ 24 августа 2011

Я использую pyodbc для запроса таблицы базы данных SQL Server 2008 со столбцами типа DATE.

Результирующие строки данных содержат строки даты, а не экземпляры python datetime.date или datetime.datetime.

Эта проблема возникает только для столбцов типа DATE;столбцы типа DATETIME обрабатываются правильно и возвращают экземпляр datetime.datetime.

Пример

import pyodbc
from pprint import pformat
db = pyodbc.connect("DRIVER={SQL Server};SERVER=.\\SQLEXPRESS;DATABASE=scratch;Trusted_Connection=yes")
print pformat(db.cursor().execute("select * from Contract").description)

Результаты:

(('id', <type 'int'>, None, 10, 10, 0, False),
 ('name', <type 'str'>, None, 23, 23, 0, False),
 ('some_date', <type 'unicode'>, None, 10, 10, 0, True),
 ('write_time', <type 'datetime.datetime'>, None, 23, 23, 3, False))

Обратите внимание, что some_date столбец указан как строка типа unicode, однако в базе данных этот столбец определен как DATE:

CREATE TABLE dbo.Contract(
    id INT NOT NULL,
    name VARCHAR(23) NOT NULL,
    some_date DATE NULL,
    write_time DATETIME NOT NULL)

Это нормально, и как я могу лучше всего исправить это?

1 Ответ

7 голосов
/ 25 августа 2011

Использовать собственный клиент SQL Server. например Поместите Driver = {Собственный клиент SQL Server 10.0} в строку подключения вместо DRIVER = {SQL Server} .

Воспроизведен ваш сценарий с датой, возвращаемой в виде строки с использованием драйвера ODBC для SQL Server. При использовании совместимой версии 2008+ собственного клиента SQL Server тип даты возвращается, как и ожидалось, но похоже, что datetime2 возвращается в виде строки (в моем ограниченном тестировании).

Определение таблицы:

create table dbo.datetest (
    [date] date not null,
    [datetime] datetime not null,
    [datetime2] datetime2 not null
);

insert into
    dbo.datetest
values
    (CAST(current_timestamp as DATE),
     CAST(current_timestamp as datetime),
     CAST(current_timestamp as datetime2));

Пример:

import pyodbc
from pprint import pformat
db = pyodbc.connect(driver='{SQL Server Native Client 10.0}',
                    server='TESTSRVR', database='TESTDB',
                    trusted_connection='yes')
print pformat(db.cursor().execute("select * from dbo.datetest").description)

Результаты:

(('date', <type 'datetime.date'>, None, 10, 10, 0, False),
 ('datetime', <type 'datetime.datetime'>, None, 23, 23, 3, False),
 ('datetime2', <type 'unicode'>, None, 27, 27, 0, False))
...