Sam*_*Tew 5 python sql-server pyodbc azure-sql-database
我单击此链接来查询Azure数据库。
import pyodbc
server = 'your_server.database.windows.net'
database = 'your_database'
username = 'your_username'
password = 'your_password'
driver= '{ODBC Driver 13 for SQL Server}'
cnxn = pyodbc.connect('DRIVER='+driver+';PORT=1433;SERVER='+server+';PORT=1443;DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
cursor.execute("SELECT * FROM FinancialRecord where deleted=0")
row = cursor.fetchone()
while row:
print (str(row[0]) + " " + str(row[1]))
row = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)
当我运行上面的代码时,它显示错误。
追溯(最近一次调用):文件“ sqltest.py”,行10,行= cursor.fetchone()pyodbc.ProgrammingError :(尚不支持ODBC SQL类型-155。column-index = 2 type =- 155”,“ HY106”)
我是Azure的新手。有人可以帮忙吗?
ODBC SQL 类型 -155 对应于 SQL Server 类型DatetimeOFFSET
和 ODBC 类型SQL_SS_TIMESTAMPOFFSET
。本文档页面中描述了 ODBC 类型和 SQL Server 类型之间的映射。该错误消息表示 Python ODBC API 当前不支持此 SQL Server 数据类型。
要解决此问题,您需要更改查询以避免查询具有DatetimeOFFSET
数据类型的列。一种方法是确定FinancialRecord
表中具有DatetimeOFFSET
数据类型的列并将它们转换为nvarchar(100)
类型。
SELECT CAST(MyColumn as AS nvarchar(100)) AS MyColumnAsNVarChar', ...
FROM FinancialRecord where deleted=0
Run Code Online (Sandbox Code Playgroud)
pyodbc支持Output Converter函数,当数据库返回pyodbc本机不支持的SQL类型时,可以使用它们。上面链接的Wiki页面上的示例将执行客户端转换,类似于将CAST转换为服务器上的[N] VARCHAR的过程:
import struct
import pyodbc
conn = pyodbc.connect("DSN=myDb")
def handle_datetimeoffset(dto_value):
# ref: https://github.com/mkleehammer/pyodbc/issues/134#issuecomment-281739794
tup = struct.unpack("<6hI2h", dto_value) # e.g., (2017, 3, 16, 10, 35, 18, 0, -6, 0)
tweaked = [tup[i] // 100 if i == 6 else tup[i] for i in range(len(tup))]
return "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}.{:07d} {:+03d}:{:02d}".format(*tweaked)
crsr = conn.cursor()
# create test data
crsr.execute("CREATE TABLE #dto_test (id INT PRIMARY KEY, dto_col DATETIMEOFFSET)")
crsr.execute("INSERT INTO #dto_test (id, dto_col) VALUES (1, '2017-03-16 10:35:18 -06:00')")
conn.add_output_converter(-155, handle_datetimeoffset)
value = crsr.execute("SELECT dto_col FROM #dto_test WHERE id=1").fetchval()
print(value)
crsr.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)
哪个打印
2017-03-16 10:35:18.0000000 -06:00
Run Code Online (Sandbox Code Playgroud)