1. ホーム
  2. python

[解決済み] ODBC SQLタイプ -155はまだサポートされていません。

2022-02-18 19:11:56

質問

私はこれに従っています リンク を使用して、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()

上記のコードを実行すると、エラーが表示されます。

<ブロッククオート

トレースバック (最も最近の呼び出し): ファイル "sqltest.py", ライン 10, in 行 = カーソル.フェッチワン() pyodbc.ProgrammingError: ('ODBC SQL タイプ -155 はまだサポートされていません。 column-index=2 type=-155', 'HY106')

私はAzureの初心者です。どなたか助けてください。

解決方法を教えてください。

pyodbcがサポートするもの 出力コンバータ関数 これは、pyodbcがネイティブにサポートしていないSQL型をデータベースが返したときに使用できます。上記のリンク先のWikiページの例は、サーバ上でCAST to [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