2017-09-25 1 views
1

나는이 데이터베이스를 쿼리하기 위해 link을 추적합니다.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는 데이터베이스가 기본적으로 지원하지 않는 pyodbc는 SQL 유형을 반환 할 때 우리가 사용할 수 있습니다 Output Converter functions 지원합니다.

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 
를 출력 : 상기 링크 된 위키 페이지의 예는 서버 [N] VARCHAR에 CAST에 의해 달성 될 수있는 것과 유사한 클라이언트 측 변환을 수행 할
1

ODBC SQL 형식 -155는 SQL Server 유형 DatetimeOFFSET 및 ODBC 유형 SQL_SS_TIMESTAMPOFFSET에 해당합니다. ODBC 유형과 SQL Server 유형 간의 매핑은 documentation page에 설명되어 있습니다. 오류 메시지는이 SQL Server 데이터 유형이 현재 Python ODBC API에서 지원되지 않는다고 말합니다.

이 문제를 해결하려면 DatetimeOFFSET 데이터 형식의 열을 쿼리하지 않도록 쿼리를 변경해야합니다. 계속 진행하는 한 가지 방법은 DatetimeOFFSET 데이터 유형이있는 FinancialRecord 테이블의 열을 식별하고 nvarchar(100) 유형으로 변환하는 것입니다.

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