PythonでAzure SQL databaseにJDBC接続してみる

利用するモジュール

JDBCを使うためにこちらのモジュールを利用します。

github.com

$ pip install JayDeBeApi

SQL Server用のJDBC Driverダウンロード

SQL Server用のJDBCファイルのjarファイルをダウンロードします。

Microsoft SQL Server 用 JDBC Driver のダウンロード - SQL Server | Microsoft Docs

ダウンロードしたものを解凍してみるとJDBC Driverのjarが入っています。

tar xf sqljdbc_7.4.1.0_enu.tar.gz

ここから、環境にバージョンを利用します。

$ ls -1 sqljdbc_7.4/enu/*.jar
sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre11-shaded.jar
sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre11.jar
sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre12-shaded.jar
sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre12.jar
sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8-shaded.jar
sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar

今回の環境はversion 8なので mssql-jdbc-7.4.1.jre8.jar を使います。

$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

Pythonコード

サンプルのコードです。

import jaydebeapi

CLASS_NAME = 'com.microsoft.sqlserver.jdbc.SQLServerDriver'
USER_NAME = 'ユーザ名'
PASSWORD = 'パスワード'
DATABASE = 'DB名'
HOST = 'サーバー名.database.windows.net'
URL = 'jdbc:sqlserver://{}:1433;database={};encrypt=true;'.format(
    HOST,DATABASE
) 

# DBに接続
conn = jaydebeapi.connect(
    CLASS_NAME,
    URL,
    driver_args=[USER_NAME,PASSWORD],
    jars="./sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar")


# 接続が上手く行ったらクエリを投げてみる
cur = conn.cursor()
cur.execute("select * from dbo.YourTable")
cur.fetchone()

# 最後はクローズする
cur.close()
conn.close()

既知のエラー

以下のエラーはJPype1というJavaモジュールの利用時に使われるパッケージによるものです。

AttributeError: '_jpype.PyJPField' object has no attribute 'getStaticAttribute'

記事書いている時点ではJPype1の0.7以上でエラーが発生するようで、以下のように古いバージョンをインストールすると解決します。 JayDeBeApiの1.1.2では解消しているようです。

$ pip install JPype1==0.6.3 --force-reinstall

関連

docs.microsoft.com