利用するモジュール
JDBCを使うためにこちらのモジュールを利用します。
$ 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