python - 如何在pyodbc下将datetime.time返回类型更改为字符串?

标签 python sql-server pyodbc

我已将现有大型 Python 2 项目的代码库从 pymssql 移至至pyodbc 。迁移很简单,一切都构建并运行良好,除了 pyodbc 将时间类型的 SQL Server 列返回为 datetime.time ,其中 pymssql(以及 PostgreSQL native 驱动程序)返回字符串。

意思是,我收到一个datetime.time(11, 54, 13, 161000)对象而不是 11:54:13.161000 。有什么方法可以在全局范围内更改此行为,而无需诉诸某种存储过程?处理返回的对象而不是返回的字符串将需要几天的重构和测试。

最佳答案

您可以使用 pyodbc Output Converter function捕获从 SQL Server 返回的 TIME 值并将其格式化为字符串。

之前:

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()

关于python - 如何在pyodbc下将datetime.time返回类型更改为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48287670/

相关文章:

python - 如何将 Scikit-Learn 的 RandomizedSearchCV 与 Tensorflow 的 ImageDataGenerator 结合使用

python - 在 python 中获取 Windows 版本的更好方法是什么?

python - 在 Python 中使用多处理模块时无法在进程之间互锁

sql - 如何编写 sql 查询来对数据集进行排序或分组

SQL Server - 脏读的优点和缺点

python - 只有 unicode 字符串的第一个字符被写入 csv

python - 如何从 Scikit 学习中加速 k-means?

sql-server - SQL Management Studio 2014自动更改登录密码

sql-server-2008 - Debian Linux 上的 pyodbc/FreeTDS/unixODBC : issues with TDS Version

sql-server - 08S01 : ODBC Driver 17 for SQL Server; TCP Provider: Error code 0x2746 (10054)