pyodbc and sql server, apply datetime.date to DATE column
pyodbc使用DATETIME列处理好datetime.datetime对象。 无需特殊格式。
但它失败了datetime.date对象和DATE列:[HY004] [FreeTDS][SQL Server]Invalid data type (0) (SQLBindParameter)
一种方法是使用.isoformat()方法将datetime.date对象作为字符串插入。
但:
1 2 3 4 5 6
| d1 = dt.date.today()
d2 = dt.datetime.now()
print(isinstance(d1, dt.date))
print(isinstance(d1, dt.datetime))
print(isinstance(d2, dt.date))
print(isinstance(d2, dt.datetime)) |
回报
是不是有比这样的测试更好的方法?
1 2
| if isinstance(d1, dt.date) and not isinstance(d1, dt.datetime):
d1 = d1.isoformat() |
-
你使用FreeTDS连接? 你的FreeTDS和unixODBC配置是什么? 或者你是从Windows连接? 这可能是由于使用太低的TDS版本引起的。
-
"但[pyodbc]使用datetime.date对象和DATE列失败" - 这是一个FreeTDS ODBC问题,而不是pyodbc问题本身。 使用Microsoft的"ODBC驱动程序13 for SQL Server"时,pyodbc可以正常使用DATE列和datetime.date参数值。
-
是的FreeTDS确实,我修改了标签
我能够在FreeTDS 0.91下重现您的问题,这是由Ubuntu下的apt install tdsodbc分发的版本。 但是,我能够成功使用datetime.date参数值来填充DATE列
-
FreeTDS的最新稳定版本(目前为01.00.0080),或
-
微软的"用于SQL Server的ODBC驱动程序13"
-
我确实在Debian下使用0.91(即应该与你的Ubuntu相同).ii freetds-common 0.91-6 FreeTDS SQL客户端库的所有配置文件ii tdsodbc:amd64 0.91-6 + b1 amd64用于连接MS SQL的ODBC驱动程序 Sybase SQL服务器
-
问题甚至在Debian测试(又名Buster)上只有0.91-6.1是有用的。
-
如果您的配置为0.91,则将TDS版本设置为7.2时应该可以正常工作。 如果将其设置为8.0或7.1或更低,则不支持DATE类型。
-
@FlipperPA - 我尝试将;TDS_version=7.2添加到0.91下的连接字符串,但它没有解决这个特殊问题(参数绑定)。 我也试过;TDS_version=7.3但显然0.91不支持协议版本7.3,因为TDSDUMP告诉我它实际上使用的是协议版本4.2(默认)。