Python で Redshift の JDBC ドライバを使ってみる(JayDeBeApi)

Python から Redshift へ接続する方法で psycopg 以外の方法が無いものか探していた所 JayDeBeApi なるものを見つけました。Amazon 謹製の JDBC Driver を使えるかなということで試してみました。

テスト環境

  • OS X 10.11.6, Java 8u112, Python 3.6.1, JayDeBeApi 1.1.1, RedshiftJDBC42-1.2.1.1001.jar
  • Windows 7, Java 8u131, Python 2.7.13, JayDeBeApi 1.1.1, RedshiftJDBC42-1.2.1.1001.jar

※環境変数 JAVA_HOME の設定が必要です。
※本来 Python 3 の場合は JayDeBeApi3 を利用するようなのですが、エラーが発生してしまったので 1.1.1 で試しました。

Redshift JDBC ドライバの用意

コチラからダウンロードできます。任意の場所へ配置します。

JayDeBeApi のインストール

コチラの通り pip を用いてインストールできます。

$ pip install JayDeBeApi

Python インタプリタから Redshift へ接続

下記のように Redshift へ接続し一時テーブルを作成しました。

$ python
Python 3.6.1 (default, Jun  2 2017, 19:53:52) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import jaydebeapi
>>> conn = jaydebeapi.connect("com.amazon.redshift.jdbc.Driver",
... "jdbc:redshift://mycluster.us-east-1.redshift.amazonaws.com:5439/mydb",
... ["user", "password"],
... "/path/to/RedshiftJDBC42-1.2.1.1001.jar")
>>> curs = conn.cursor()
>>> curs.execute("create temp table item (name varchar(255), price integer, description text)")
>>> curs.execute("insert into item values ('hoge', 1234, 'HogeHoge')")
>>> curs.execute("insert into item values ('piyo', 2345, 'PiyoPiyo')")
>>> curs.execute("insert into item values ('fuga', 3456, 'FugaFuga')")
>>> curs.execute("select * from item")

SELECT 文を execute した後、fetchall で結果が取得できました。

>>> curs.execute("select * from item")
>>> curs.fetchall()
[('hoge', 1234, 'HogeHoge'), ('piyo', 2345, 'PiyoPiyo'), ('fuga', 3456, 'FugaFuga')]
>>> curs.close()
>>> conn.close()
>>> exit()
$ 

Windows の場合は Redshift JDBC ドライバのパス指定時にバックスラッシュのエスケープに気をつけてください。

# C:\path\to\RedshiftJDBC42-1.2.1.1001.jar
"C:\\Path\\to\\RedshiftJDBC42-1.2.1.1001.jar"

まとめ

おもいのほか問題なく接続できたのでびっくりしました。Java 自体がマルチプラットフォームなので環境を選ばずに使用できるのがよいですね。Python から Redshift へクエリを発行したいケースで、選択肢のひとつになるではないかと思います。