2017-09-25 54 views
1

我按照此link來查詢Azure數據庫。ODBC SQL類型-155尚不支持

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

當我運行上面的代碼時,它顯示錯誤。

Traceback (most recent call last): File "sqltest.py", line 10, in row = cursor.fetchone() pyodbc.ProgrammingError: ('ODBC SQL type -155 is not yet supported. column-index=2 type=-155', 'HY106')

我是Azure的新手。任何人都可以幫忙

回答

2

pyodbc支持Output Converter functions當數據庫返回pyodbc本身不支持SQL類型,我們可以使用。上面鏈接維基頁的示例將執行類似於將由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() 

它打印

2017-03-16 10:35:18.0000000 -06:00 
1

ODBC SQL類型-155對應於SQL Server類型DatetimeOFFSET和ODBC類型​​。在這個documentation page中描述了ODBC類型和SQL Server類型之間的映射。該錯誤消息表示,此SQL Server數據類型當前不受Python ODBC API支持。

要解決此問題,您需要更改查詢以避免查詢使用DatetimeOFFSET數據類型的列。一種方法是確定FinancialRecord表中具有DatetimeOFFSET數據類型的列,並將它們轉換爲nvarchar(100)類型。

SELECT CAST(MyColumn as AS nvarchar(100)) AS MyColumnAsNVarChar', ... 
FROM FinancialRecord where deleted=0