GridDB Python API(SQL)ガイド

はじめに

本ドキュメントでは、GridDB PythonAPIのSQLインタフェースについて説明します。

GridDB PythonAPIのSQLインタフェースは、JPype DBAPI2(OSS)を利用してJDBCドライバにアクセスし、 DBAPI2仕様に準拠した操作を提供します。

また、検索結果が大量ヒット時のデータ取得を高速化するために、Apache Arrow(OSS)の 利用方法についても説明します。

※ DBAPI2: PEP 249 – Python Database API Specification v2.0

https://peps.python.org/pep-0249/

  • Python言語標準のDBアクセス用のAPI仕様

※ JPype:

https://jpype.readthedocs.io/en/latest/index.html

  • Python からJNI(Java Native Interface)経由で Java アクセスを提供するソフト(OSS)

※ JPype DBAPI2:

https://jpype.readthedocs.io/en/latest/dbapi2.html

  • JPype内のモジュールの1つ。JDBCドライバ上にDBAPI仕様による操作(実装)を提供するソフト(OSS)

※ Apahe Arrow:

https://arrow.apache.org/

  • Apacheプロジェクトの1つ。効率的なデータ交換のために設計された、カラム指向のデータフォーマット、ソフト(OSS)

動作環境

  • OS: RHEL7.9/8.10/9.4、Ubunt20.04/22.04/24.04、Windows10/11、Windows Server 2022

  • Java: 8/11/17/21

  • Python: 3.9/3.10/3.11/3.12

※ 本ガイドで記載している使い方について動作確認をしております。

クライアント側の動作に必要なソフト

  • GridDB JDBCドライバ

  • JPype 1.5.0

  • (データ取得を高速化したい場合) Apache Arrow 16.0.0

インストール

前提条件

以下についてはインストール済であるとします。

  • Java、Pythonの実行環境

  • Python用パッケージをインストールするために使われるpip

  • GridDB JDBCドライバ

JPypeおよびApache Arrowをインストールします。

インストーラ(インストール用パッケージ)一覧

インストーラ(インストール用パッケージ)の一覧は以下のとおりです。

(Linux用)

対象ソフト

インストーラ

備考

JPype

JPype1-1.5.0-cp###-cp###-win_amd64.whl

Apache Arrow (Python側での処理用)

pyarrow-16.0.0-cp###-cp###-win_amd64.whl

Apache Arrow (Java側での処理用)

griddb-ee-python-lib-X.X.X-linux.x86_64.rpm

RHEL用

griddb-ee-python-lib_X.X.X_amd64.deb

Ubuntu用

(Windows系のOS用)

対象ソフト

インストーラ

JPype

JPype1-1.5.0-cp###-cp###-win_amd64.whl

Apache Arrow (Python側での処理用)

pyarrow-16.0.0-cp###-cp###-win_amd64.whl

Apache Arrow (Java側での処理用)

インストールメディアのWindows/Python-APIフォルダ上のjarファイルを作業フォルダにコピーして利用してください。

※ X.X.Xの部分はGridDBのバージョンを意味します。

※ ###の部分は39、310、311、312から構成され、Pythonのバージョンを意味します。

JPypeのインストール

Pythonのバージョンに相当するwhlファイルを使って、インストールしてください。

(Linux系のOSの場合)

# pip install JPype1-1.5.0-cp###-cp###-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

(Windows系のOSの場合)

# pip install JPype1-1.5.0-cp###-cp###-win_amd64.whl

※ ###の部分は39、310、311、312から構成され、Pythonのバージョンを意味します。

Apache Arrow(Python側での処理用)のインストール

Pythonのバージョンに相当するwhlファイルを使って、インストールしてください。

(Linux系のOSの場合)

# pip install pyarrow-16.0.0-cp###-cp###-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

(Windows系のOSの場合)

# pip install pyarrow-16.0.0-cp###-cp###-win_amd64.whl

※ ###の部分は39、310、311、312から構成され、Pythonのバージョンを意味します。

Apache Arrow(Java側での処理用)のインストール

Linuxの場合はインストーラを使って、Apache Arrow用のjarファイルをインストールしてください。

Windows系のOSの場合は、インストールメディアからApache Arrow用のjarファイルを作業フォルダにコピーしてください。

(RHELの場合)

# rpm –ivh griddb-ee-python-lib-X.X.X-linux.x86_64.rpm

Apache Arrow用のjarファイルが/usr/share/java/フォルダにインストールされます。

(Ubuntuの場合)

# dpkg –i griddb-ee-python-lib_X.X.X_amd64.deb

Apache Arrow用のjarファイルが/usr/share/java/フォルダにインストールされます。

(Windows系のOSの場合)

以下のApache Arrow用のjarファイルを作業フォルダにコピーしてください。

  • gridstore-X.X.X-arrow-jdbc-16.0.0-jar-with-dependencies.jar

※ X.X.Xの部分はGridDBのバージョンを意味します。

設定

バージョン8以外のJavaでApache Arrowを利用する場合は、環境変数_JAVA_OPTIONSもしくは環境変数JAVA_TOOL_OPTIONSに以下の設定をしてください。

(Linux系のOSの場合の設定例)

# export _JAVA_OPTIONS="--add-opens=java.base/java.nio=ALL-UNNAMED"

Windows系のOSの場合には、更に環境変数JAVA_HOMEにJDKをインストールしたディレクトリを設定してください。 また、環境変数PATHに%JAVA_HOME%binを追加してください。

その他

(Windows系のOSの場合)

「import jpype」「import pyarrow」においてimportに失敗する時は、 Microsoft Visual C++ 2015 再頒布可能パッケージのインストールが必要になる場合があります。

基本編

基本操作

基本操作として、接続、SQLの実行、検索結果の取得の3種類あります。

大分類

クラス

メソッド

機能概要

接続

connect()

接続

SQLの実行

Cursor

execute()

SQLの実行

Cursor

executemany()

N個入力のSQLの実行

検索結果の取得

Cursor

fetchone()

1件取得

Cursor

fetchmany()

取得件数指定の取得

Cursor

fetchall()

全件取得

事前処理

事前に以下のインポートとJVMの起動が必要です。

import jpype
import jpype.dbapi2
jpype.startJVM(classpath=['/usr/share/java/gridstore-jdbc.jar'])

startJVM()メソッドにて、JDBCドライバファイル /usr/share/java/gridstore-jdbc.jar をクラスパスに指定します。 また、SSL機能を利用してGridDBクラスタとクライアントの通信を保護する場合には、 /usr/share/java/gridstore-advanced.jarも追加でクラスパスに指定してください。

※ Windows系のOSの場合は、コピーしたjarファイルのパスを指定してください。

接続

connect()メソッドに以下を指定してください。

  • url: 接続に使うURL

  • driver: "com.toshiba.mwcloud.gs.sql.Driver"

  • driver_args: GridDBサーバに接続するためのGridDBユーザ名とパスワード

接続の例

url = "jdbc:gs://127.0.0.1:20001/myCluster/public"
conn = jpype.dbapi2.connect(url, driver="com.toshiba.mwcloud.gs.sql.Driver",
        driver_args={"user":"admin", "password":"admin"})

接続時のURL形式

URLは以下の(A)~(D)の形式となります。クラスタ構成方式がマルチキャスト方式の場合、通常は(A)の形式で接続してください。 GridDBクラスタ側で自動的に負荷分散が行われ適切なノードに接続されます。 GridDBクラスタとの間でマルチキャストでの通信ができない場合のみ、他の形式で接続してください。

(A)マルチキャスト方式のGridDBクラスタの適切なノードへ自動的に接続する場合

jdbc:gs://(multicastAddress):(portNo)/(clusterName)/(databaseName)
  • multicastAddress:GridDBクラスタとの接続に使うマルチキャストアドレス。(デフォルト: 239.0.0.1)

  • portNo:GridDBクラスタとの接続に使うポート番号。(デフォルト: 41999)

  • clusterName:GridDBクラスタのクラスタ名

  • databaseName:データベース名。省略した場合はデフォルトデータベース(public)に接続します。

(B)マルチキャスト方式のGridDBクラスタ内のノードに直接接続する場合

jdbc:gs://(nodeAddress):(portNo)/(clusterName)/(databaseName)
  • nodeAddress:ノードのアドレス

  • portNo:ノードとの接続に使うポート番号。(デフォルト: 20001)

  • clusterName:ノードが属するGridDBクラスタのクラスタ名

  • databaseName:データベース名。省略した場合はデフォルトデータベース(public)に接続します。

(C)固定リスト方式のGridDBクラスタに接続する場合

クラスタ構成方式が固定リスト方式の場合、この形式で接続してください。

jdbc:gs:///(clusterName)/(databaseName)?notificationMember=(notificationMember)
  • clusterName:GridDBクラスタのクラスタ名

  • databaseName:データベース名。省略した場合はデフォルトデータベース(public)に接続します。

  • notificationMember:ノードのアドレスリスト(URLエンコードが必要)。デフォルトポートは20001

    例:192.168.0.10:20001,192.168.0.11:20001,192.168.0.12:20001

※notificationMemberはgs_cluster.jsonファイルを編集することで変更可能です。 アドレスリストで使うポートは、gs_node.jsonファイルを編集することで変更可能です。

(D)プロバイダ方式のGridDBクラスタに接続する場合

クラスタ構成方式がプロバイダ方式の場合、この形式で接続してください。

jdbc:gs:///(clusterName)/(databaseName)?notificationProvider=(notificationProvider)
  • clusterName:GridDBクラスタのクラスタ名

  • databaseName:データベース名。省略した場合はデフォルトデータベースに接続します

  • notificationProvider:アドレスプロバイダのURL(URLエンコードが必要)

※notificationProviderはgs_cluster.jsonファイルを編集することで変更可能です。

その他情報の設定

接続時には次の情報も設定できます。

設定項目

プロパティ名

説明

接続タイムアウト

loginTimeout

接続タイムアウト(秒)。デフォルトは300秒

認証方式

authenticaion

INTERNAL(内部認証)/LDAP(LDAP認証)の2種類があります。デフォルトはINTERNAL

SSL通信の設定

sslMode

DISABLED(SSL無効)/PREFFERED(GridDBクラスタ設定に従う)/VERIFY(SSL有効。サーバ検証あり)の3種類があります。デフォルトはDISABLED DISABLED

外部通信経路指定

connectionRoute

外部通信経路を用いた接続を行う場合、PUBLICを指定します

マルチキャスト受信I/F指定

notificationNetworkInferfaceAddress

マルチキャストパケットを受信するインターフェースのアドレス

アプリケーション名

applicationName

アプリケーション名

タイムゾーン

timeZone

タイムゾーン。サーバ側で指定したタイムゾーンの日時文字列を取得したい場合に指定します

GridDBユーザ名と同様にdriver_args部分に「プロパティ名=設定値」形式で設定できます。 また、接続タイムアウト以外は、URLの末尾に「?プロパティ名=設定値」形式で追記しても設定できます。。

※SSL通信設定(sslMode)をVERIFYに設定する場合、信頼する認証局の証明書がトラストストアになければ、keytoolコマンドを使ってインポートしてください。必要な場合は、java起動時の引数で、トラストストア(-Djavax.net.ssl.trustStore)、パスワード(-Djavax.net.ssl.trustStorePassword)を指定してください。信頼する認証局の証明書の有効期限切れ確認は未サポートです。

SQLの実行

3つの実行例を示します。

  1. execute()によるSQLの実行例

curs = conn.cursor()
curs.execute("CREATE TABLE IF NOT EXISTS Sample ( id integer PRIMARY KEY, value string )")
curs.execute("INSERT INTO Sample values (0, 'test0')")
curs.execute("INSERT INTO Sample values (1, 'test1')")
curs.execute("SELECT * from Sample where id > 0")
print(curs.fetchall())

サンプルコードはsampleSimple.pyをご参照ください。

  1. execute()によるプレースホルダ付きSQLの実行例

プレースホルダは「?」記号を使います。

curs = conn.cursor()
curs.execute("INSERT INTO Sample values (?, ?)", (0, 'test0'))

サンプルコードはsampleParametered.pyをご参照ください。

  1. executemany()によるプレースホルダ付きSQLの実行例

curs = conn.cursor()
data = [ (0, 'test0'), (1, 'test1'), (2, 'test2') ]
curs.executemany("INSERT INTO Sample values (?, ?)", data)

サンプルコードはsampleMany.pyをご参照ください。

検索結果の取得

3つの実行例を示します。

  1. 1件取得の例

curs.execute("SELECT * from Sample where id > 0")
curs.fetchone()
  1. N件指定での取得の例

curs.execute("SELECT * from Sample where id > 0")
curs.fetchmany(10)
  1. 全件取得の例

curs.execute("SELECT * from Sample where id > 0")
curs.fetchall()

その他

以下のプロパティを使うことで、JDBCの直接操作が可能です。

  • Conectionクラスのconnectionプロパティ:JDBCのConnectionオブジェクトを取得し、メタデータ取得等のJDBCの操作が可能

  • CursorクラスのresultSetプロパティ:JDBCのResultSetオブジェクトを取得し、JDBCの操作が可能

制限事項

JPype DBAPI2では以下の操作をサポートしておりません。【JPype DBAPI2仕様】

  • setinputsizes(sizes)

  • setoutputsize(size [, column])

GridDB PythonAPI(SQL I/F)では以下の操作はサポートしておりません。【GridDB仕様】

  • プロシージャコール(callproc())

  • commit()およびroolback()

  • nextset()およびlastrowidプロパティ

応用編

JPype DBAPI2のカスタマイズ機能を使うことで、以下の操作が可能となります。

  • TIMESTAMP型のナノ秒精度でのデータ取得

  • int/float型でのデータ取得

  • BLOB型のデータ設定

JPype DBAPI2をカスタマイズするために、Adapters/Convertersを使うことになります。

  • Adapters:パラメータを設定するときに、Python型からJava型に変換するために使用されます。

  • Converters:検索結果が生成されるとコンバータを使用して、Java型をPython型に変換し直すことができます。

TIMESTAMP型のナノ秒精度でのデータ取得

Connectionオブジェクトの_convertersメンバに以下の設定を追加することで、 ナノ秒精度で定義されたTIMESTAMP型のデータ取得で、ナノ秒を保持することが可能になります。

import jpype.imports
import java.sql.Timestamp

conn._converters[java.sql.Timestamp] = jpype.dbapi2._nop

サンプルコードはsampleTimestamp2-Nano.pyをご参照ください。

Pythonのint/float型でのデータ取得

Connectionオブジェクトの_convertersメンバに以下の設定を追加することで、 Pythonのint/float型でデータを取得できるようになります。

  • GridDBの整数型であるBYTE型・SHORT型・INTEGER型・LONG型についてPythonのint型でのデータ取得

  • GridDBのFLOAT型・DOUBLE型についてPythonのfloat型でのデータ取得

conn._converters[jpype.JByte] = int
conn._converters[jpype.JShort] = int
conn._converters[jpype.JInt] = int
conn._converters[jpype.JLong] = int
conn._converters[jpype.JFloat] = float
conn._converters[jpype.JDouble] = float

サンプルコードはsampleTypes-IntFloat.pyをご参照ください。

BLOB型のデータ設定

Connectionオブジェクトの_adaptersメンバと_default_settersグローバルメンバに対し、 以下の設定を追加することで、GridDBのBLOB型にデータ設定することが可能になります。

(入力がbytes型の場合)

import jpype.imports
from javax.sql.rowset.serial import SerialBlob

conn._adapters[bytes] = SerialBlob
jpype.dbapi2._default_setters[SerialBlob] = jpype.dbapi2.BLOB

(入力がBinary型の場合)

import jpype.imports
from javax.sql.rowset.serial import SerialBlob

conn._adapters[jpype.JArray(jpype.JByte)] = SerialBlob
jpype.dbapi2._default_setters[SerialBlob] = jpype.dbapi2.BLOB

入力がbytes型の場合のサンプルコードはsampleBlob.pyをご参照ください。

結果取得の高速化

検索結果が大量になる場合、結果取得に時間がかかります。 Apache Arrowを使って結果取得することで、処理時間が短縮される場合があります。 Apache Arrowを使った結果取得の方法には2通りあります。

  • 全件一括取得

  • 全件分割取得

・JVM起動時のclasspathにJava処理用のjarファイル(/usr/share/java/gridstore-arrow-jdbc.jar)のパスを追加します。

※ Windows系のOSの場合は、コピーしたjarファイルのパスを指定してください。

(Arrow JDBC Adapter)

JPype経由で以下のJavaクラスを利用します。

RootAllocator

Arrowを利用するためのアロケータクラス

JdbcToArrow

JDBCドライバのResultSetオブジェクトからArrow用のオブジェクトを作成するためのクラス

JdbcToArrowConfigBuilder

JdbcToArrowConfigオブジェクトを生成するためのクラス

(PyArrow - Apache Arrow Python bindings)

また、以下のPython上のArrow用オブジェクトを利用します。

RecordBatch

カラム指向のデータ構造。スキーマと各カラムごとのデータリストから構成されます

全件一括取得

検索結果を全件一括で取得する操作は以下の通りです。

(A)事前準備

JVM起動後に以下の事前準備を行います。

  • pyarrow.jvmとJava処理用クラスをインポートします。

  • RootAllocatorオブジェクトを生成します。

import pyarrow.jvm
from org.apache.arrow.adapter.jdbc import JdbcToArrow
from org.apache.arrow.memory import RootAllocator

ra = RootAllocator(sys.maxsize)

(B)データ取得処理

検索実行後に以下の操作を行います。

  • CursorクラスのresultSetプロパティでJDBCドライバのResultSetオブジェクトを取得します。

  • ResultSetオブジェクトとRootAllocatorオブジェクトからArrow処理用のイテレータ(sqlToArrowVectorIterator)を取得します。

  • イテレータのnext()メソッドで全件一括でデータ取得がなされます。

  • pyarrow.jvmのrecord_batch()メソッドでPython上にRecordBatchオブジェクトを生成します。

result_set = curs.resultSet

it = JdbcToArrow.sqlToArrowVectorIterator(result_set, ra)
while it.hasNext():
    root = it.next()
    if root.getRowCount() == 0:
        break
    x = pyarrow.jvm.record_batch(root)
    print(x)

サンプルコードはsampleArrowIteratorAll.pyをご参照ください。

全件分割取得

検索結果の件数が非常に多い場合、分割して取得することが可能です。

(A)事前準備

JVM起動後に以下の事前準備を行います。

  • pyarrow.jvmとJava処理用クラスをインポートします。

  • RootAllocatorオブジェクトを生成します。

  • JdbcToArrowConfigBuilderオブジェクトを生成し、setTargetBatchSize()メソッドで分割して取得する件数を設定します。

  • JdbcToArrowConfigオブジェクトを生成します。

以下、2件づつデータを取得する場合の例です。

import pyarrow.jvm
from org.apache.arrow.adapter.jdbc import JdbcToArrowConfigBuilder, JdbcToArrow
from org.apache.arrow.memory import RootAllocator

ra = RootAllocator(sys.maxsize)

config_builder = JdbcToArrowConfigBuilder()
config_builder.setAllocator(ra)
config_builder.setTargetBatchSize(2) # 分割して取得する件数を設定
pyarrow_jdbc_config = config_builder.build()

(B)データ取得処理

検索実行後に以下の操作を行います。

  • CursorクラスのresultSetプロパティでJDBCドライバのResultSetオブジェクトを取得します。

  • ResultSetオブジェクトとJdbcToArrowConfigオブジェクトからArrow処理用のイテレータ(sqlToArrowVectorIterator)を取得します。

  • イテレータのnext()メソッドで上記設定した分割取得件数分のデータ取得がなされます。

  • pyarrow.jvmのrecord_batch()メソッドでPython上にRecordBatchオブジェクトを生成します。

result_set = curs.resultSet

it = JdbcToArrow.sqlToArrowVectorIterator(result_set, pyarrow_jdbc_config)
while it.hasNext():
    root = it.next()
    if root.getRowCount() == 0:
        break
    x = pyarrow.jvm.record_batch(root)
    print(x)

サンプルコードはsampleArrowIterator.pyをご参照ください。

付録

JPype DBAPI2のAPIリファレンス

Constructors

dbapi2.connect(dsn, *, driver=None, driver_args=None)

データベースへの接続を作成します。

パラメータ:【JPype DBAPI2仕様】

dsn (str): JDBC のデータベース接続文字列(URL)。

driver (str, optional): ロードする JDBC ドライバ。"com.toshiba.mwcloud.gs.sql.Driver"を指定してください。【GridDB仕様】

driver_args (dict): ドライバへの引数。

例外:

接続を確立できない場合はエラーになります。

戻り値:

成功した場合、新しいConnectionオブジェクトを返します。

Globals

JPype dbapi2 は、モジュールの動作を定義するいくつかのグローバルを定義します。 これらの値は定数です。

apilevel

モジュールのapilevelは「2.0」です。

threadsafety

threadsafetyのレベルは 2 で、「スレッドはModuleとConnectionを共有してもよい」 という意味です。ただし、実際のレベルは、JDBC が接続されているドライバの 実装によって異なります。

GridDBのJDBCドライバでは、Moduleを共有できますが、Connectionを共有することは できません。【GridDB仕様】 Connectionを作成したスレッド以外のスレッドで、そのConnectionを使用しようとすると、 エラーが発生します。

上記のコンテキストでの共有とは、2 つのスレッドが、リソース ロックを実装する ためにミューテックス セマフォを使用してリソースをラップすることなく、リソースを 使用できることを意味します。ミューテックスを使用してアクセスを管理しても、 外部リソースを常にスレッド セーフにできるわけではないことに注意してください。 リソースは、制御できないグローバル変数やその他の外部ソースに依存している 可能性があります。

paramstyle

JPype dbapi2モジュールのparamstyleは「qmark」です。

paramstyle

意味

qmark

Question mark style, 例) ...WHERE name=?

Connection Objects

class dbapi2.Connection

接続により、JDBC データベースへのアクセスが提供されます。

接続は管理され、Python の with ステートメントの一部として使用できます。 接続は、ガベージ コレクションされたとき、with ステートメントのスコープ の終了時、または手動で閉じられたときに自動的に閉じられます。 接続が閉じられると、データベースを使用するすべての操作でエラーが発生します。

property autocommit

自動コミット動作を制御するプロパティ。【JPype DBAPI2仕様】

True/Falseの設定操作は可能ですが変更はできません。常にTrueを返します。【GridDB仕様】

Type:

bool

close()

(.__del__() が呼び出されるたびにではなく、)すぐに接続を閉じます。

この時点から接続は使用できなくなります。 接続で何らかの操作を行おうとすると、Error (またはサブクラス) 例外が発生します。 接続を使用しようとしているすべてのカーソルオブジェクトにも同じことが適用されます。

commit()

コミット

未サポートです。実行するとエラーになります。【GridDB仕様】

property connection

この Python Connectionオブジェクトをサポートする JDBC Connectionオブジェクトを取得します。【JPype DBAPI2仕様】

これを使用して、DBAPIドライバの範囲外にある追加のメタデータやその他の機能を取得できます。

cursor()

新しいカーソル オブジェクトを返します。

rollback()

ロールバック

未サポートです。実行するとエラーになります。【GridDB仕様】

property typeinfo

このドライバでサポートされているタイプのリスト。【JPype DBAPI2仕様】

これはドライバの機能を確認するのに役立ちます。

Type:

list

Cursor Objects

class dbapi2.Cursor

カーソルはクエリを実行し、結果を取得するために使用されます。

一部は PreparedStatement、一部は ResultSet で、カーソルは両方の組み合わせです。 JDBCのresultSetオブジェクトには resultSetプロパティでアクセスできます。

カーソルは管理され、Python の with ステートメントの一部として使用できます。 カーソルは、ガベージ コレクションされたとき、with ステートメントのスコープの終了時、 または手動で閉じられたときに自動的に閉じます。 カーソルが閉じられると、データベースを使用するすべての操作でエラーが発生します。

property arraysize

.fetchmany()メソッドで取得する行数を指定します。

この読み取り/書き込み属性は、.fetchmany()メソッドで一度に取得する行数を指定します。 デフォルトでは1に設定され、一度に1行取得することを意味します。

callproc(procname, parameters=())

ストアド プロシージャを呼び出します。

未サポートです。実行するとエラーになります。【GridDB仕様】

close()

(__del__ が呼び出されるたびに閉じるのではなく、)すぐにカーソルを閉じます。

この時点からカーソルは使用できなくなります。 カーソルを使用して何らかの操作を行おうとすると、Error (またはサブクラス) 例外が発生します。

property description

[読み取り専用属性] descriptionは7項目のシーケンスのシーケンスです。【JPype DBAPI2仕様】

これらの各シーケンスには、1 つの結果列を記述する情報が含まれています。

  • 名前(name):列名

  • タイプコード(type_code):列のデータ型

  • 表示サイズ(display_size):常に131072【GridDB仕様】

  • 内部サイズ(internal_size):常に131072【GridDB仕様】

  • 精度(precision):TIMESTAMP型の場合は3(ミリ秒精度)または6(マイクロ秒精度)または9(ナノ秒精度)、他の型の場合は0【GridDB仕様】

  • スケール(scale):常に0【GridDB仕様】

  • isNullable(null_ok):カラムにNULL値を許可する定数ResultSetMetaData.columnNullable(=1)、またはカラムにNULL値を許可しない定数columnNoNulls(=0)【GridDB仕様】

これは、最後のクエリによって結果セット(ResultSet)が生成された場合にのみ使用できます。

execute(operation, parameters=None)

データベース操作 (クエリまたはコマンド) を準備して実行します。

パラメータはシーケンスとして提供され、操作内の変数にバインドされます。 変数は qmark 表記、すなわち「?」記号で指定されます。【JPype DBAPI2仕様】 JDBC はマッピング スタイルのパラメータをサポートしていません。

ステートメントを実行すると行数が更新されます。ステートメントに結果セットがない場合、 行数は -1 になります。ステートメントは複数の結果セットを生成する場合があります。 複数の結果セットを走査するには、nextset()メソッドを使用します。

パラメータ:

operation (str): 実行されるステートメント。

parameters (list, optional): ステートメントのパラメータのリスト。 パラメータの数はステートメントで要求される数と一致する必要があります。 一致しない場合はエラーが発生します。

返り値:

このカーソル。

executemany(operation, seq_of_parameters)

データベース操作 (クエリまたはコマンド) を準備し、 シーケンス seq_of_parameters で見つかったすべてのパラメータシーケンス またはマッピングに対してそれを実行します。

.execute() と同じコメントがこのメソッドにも適用されます。

パラメータ:

operation (str): 実行されるステートメント。

seq_of_parameters (list, optional): ステートメントのパラメータのリストのリスト。 パラメータの数は、ステートメントで要求される数と一致する必要があります。 一致しない場合は、エラーが発生します。

返り値:

このカーソル。

fetchall()

クエリ結果のすべての(残りの)行を取得し、 それらをシーケンスのシーケンス(タプルのリストなど)として返します。 カーソルの arraysize 属性がこの操作のパフォーマンスに影響を与える 可能性があることに注意してください。

前回の.execute*()呼び出しで結果セットが生成されなかった場合、 またはまだ呼び出しが発行されていない場合は、エラー (またはサブクラス) 例外が発生します 。

fetchmany(size=None)

複数の結果を取得します。

クエリ結果の次の行セットを取得し、シーケンスのシーケンス (タプルのリストなど) を返します。 使用可能な行がなくなった場合は、空のシーケンスが返されます。

呼び出しごとに取得する行数はsizeパラメータで指定します。 指定しない場合は、カーソルのarraysize属性によって取得する行数が決定されます。 メソッドは、sizeパラメータで指定された行数をできるだけ多く取得しようとします。 指定された行数が利用できないために取得できない場合は、返される行数が少なくなる場合があります。

前回の.execute*()呼び出しで結果セットが生成されなかった場合、 またはまだ呼び出しが発行されていない場合は、エラー (またはサブクラス) 例外が発生します 。

fetchone()

クエリ結果セットの次の行を取得し、単一のシーケンスを返します。 データがなくなった場合は None を返します。

.execute*() への以前の呼び出しで結果セットが生成されなかった場合、 またはまだ呼び出しが発行されていなかった場合は、 エラー (またはサブクラス) 例外が発生します。

property lastrowid

最後に挿入された行の ID を取得します。

未サポートです。実行するとエラーになります。【GridDB仕様】

nextset()

このカーソル内の次の結果セットを取得します。

未サポートです。常にNoneを返します。【GridDB仕様】

property parameters

[読み取り専用属性] parametersは6項目のシーケンスのシーケンスです。【JPype DBAPI2仕様】

これらの各シーケンスには、1 つの結果列を記述する情報が含まれています。 現GridDBでは全て常に同じ値を返します。【GridDB仕様】

  • タイプ名(type_name):常に"UNKNOWN"【GridDB仕様】

  • JDBCタイプ(jdbc_type):常にOTHER【GridDB仕様】

  • パラメータモード(parameter_mode) (1=入力、2=入力/出力、4=出力): 常に1【GridDB仕様】

  • 精度(precision): 常に0【GridDB仕様】

  • スケール(scale): 常に0【GridDB仕様】

  • isNullable(null_ok): 常に1【GridDB仕様】

これは、execute の後にのみ使用できます。【GridDB仕様】

property resultSet

[読み取り専用属性] JDBCのResultSetオブジェクトを取得します。【JPype DBAPI2仕様】

オブジェクトは、次の``execute*()``メソッド呼び出し時に閉じられます

property rowcount

[読み取り専用属性] UPDATE や INSERT などの DML ステートメントの場合に、 最後の .execute*() が影響を与えた行数を返します。【JPype DBAPI2仕様】

カーソルに対して .execute*() が実行されていない場合、 または最後の操作の行数がインターフェイスによって判別できない場合、 属性は -1 になります。JDBC は SELECT から返される行数の取得をサポートしていないため、 SELECT ステートメントの後の行数は -1 になります。

setinputsizes(sizes)

これは、.execute*() を呼び出す前に使用して、 操作のパラメータのメモリ領域を事前に定義できます。

サイズはシーケンスとして指定されます。つまり、入力パラメータごとに1つの項目です。 項目は、使用される入力に対応する Type Object であるか、 文字列パラメータの最大長を指定する整数である必要があります。 項目が None の場合、その列に対して事前定義されたメモリ領域は予約されません (これは、大きな入力に対して事前定義された領域を回避するのに役立ちます)。

このメソッドは、.execute*() メソッドが呼び出される前に使用されます。

(未実装)【JPype DBAPI2仕様】

setoutputsize(size, column=None)

大きな列 (LONG、BLOB など) のフェッチ用の列バッファ サイズを設定します。

列は結果シーケンスのインデックスとして指定されます。 列を指定しないと、カーソル内のすべての大きな列のデフォルト サイズが設定されます。

(未実装)【JPype DBAPI2仕様】

SQL Type Constructor

dbapi2.Timestamp(year, month, day, hour, minute, second, nano=0)

この関数は、タイムスタンプ値を保持するオブジェクトを生成します。

ナノ秒精度の値を指定できます。【JPype DBAPI2仕様】

dbapi2.TimestampFromTicks(ticks)

この関数は、指定された ticks 値 (エポックからの秒数) から タイムスタンプ値を保持するオブジェクトを生成します。

dbapi2.Binary(data)

この関数は、バイナリ (長い) 文字列値を保持できるオブジェクトを生成します。

データ型の対応関係

JPype DBAPI2 データ取得時

各GridDB TypeがPython上で取得されるデータ型との対応関係を示します。

GridDB Type

fetchxxx()メソッドで取得されるデータ型

STRING

str

BOOL

bool

BYTE

JShort

SHORT

JShort

INTEGER

JInt

LONG

JLong

FLOAT

JDouble

DOUBLE

JDouble

TIMESTAMP

datetime.datetime

BLOB

bytes

  • JXXX型はJavaのデータ型をラッピングしたデータ型です。

  • 日時を扱うデータ型では、タイムゾーンはOS等の設定に従います。

  • TIMESTAMP型はマイクロ秒精度のdatetime.datetime型で取得されるため、 ナノ秒精度のTIMESTAMP型を利用している場合はナノ秒部分がカットされます。 ナノ秒精度でデータを取得したい場合は応用編をご参照ください。

  • GridDB Typeが空間型(GEOMETRY)もしくは配列型の場合はNoneを返します。

JPype DBAPI2 データ設定時

Python上で入力するデータ型とデータ設定可能なGridDB Typeとの対応関係を 示します。

入力データ型

入力データの作成例

STRING

BOOL

BYTE

SHORT

INTEGER

LONG

FLOAT

DOUBLE

TIMESTAMP

BLOB

str

v = str('ABC')

×

×

×

×

×

×

×

×

×

JString

v = jpype.JString('ABC')

×

×

×

×

×

×

×

×

×

bool

v = bool(True)

×

×

×

×

×

×

×

×

×

JBoolean

v = jpype.JBoolean(True)

×

×

×

×

×

×

×

×

×

int

v = int(100)

×

×

×

×

JByte

v = jpype.JByte(100)

×

×

×

×

×

×

×

×

×

×

JShort

v = jpype.JShort(100)

×

×

×

×

JInt

v = jpype.JInt(100)

×

×

×

×

JLong

v = jpype.JLong(100)

×

×

×

×

float

v = float(100.12)

×

×

×

×

JFloat

v = jpype.JFloat(100.12)

×

×

×

×

JDouble

v = jpype.JDouble(100.12)

×

×

×

×

datetime

v = datetime.datetime(2024,9,3,10,55,45)

×

×

×

×

×

×

×

×

×

Timestamp

v = jpype.dbapi2.Timestamp(2024,9,3,10,55,45)

×

×

×

×

×

×

×

×

×

TimestampFromTicks

v = jpype.dbapi2.TimestampFromTicks(3600)

×

×

×

×

×

×

×

×

×

bytes

v = 'abc'.encode()

×

×

×

×

×

×

×

×

×

×

Binary

v = jpype.dbapi2.Binary('abc'.encode())

×

×

×

×

×

×

×

×

×

×

  • 〇はデータ設定できるケースがある場合、×は設定できないことを意味します。 〇であっても、値を保持できる範囲の違いにより、エラーになる場合や値が丸められる場合があります。

  • JByte型はどのGridDB Typeにもデータ設定できません。

  • 日時を扱うデータ型では、タイムゾーンはOS等の設定に従います。

  • datetime型ではマイクロ秒精度に制限されますが、Timestamp型を使うと、ナノ秒精度のデータを設定できます。

  • bytes型/BINARY型はどのGridDB Typeにもデータ設定できませんが、応用編に記載のカスタマイズ機能を使うことで、BLOB型にデータ設定できるようになります。

  • GridDB Typeが空間型(GEOMETRY)もしくは配列型へのデータ設定はできません。

Apache Arrow データ取得時

各GridDB Typeはpyarrowの配列のデータ型で取得されます。

GridDB Type

pyarrowで取得されるデータ型

STRING

pyarrow.lib.StringArray

BOOL

pyarrow.lib.BooleanArray

BYTE

pyarrow.lib.Int8Array

SHORT

pyarrow.lib.Int16Array

INTEGER

pyarrow.lib.Int32Array

LONG

pyarrow.lib.Int64Array

FLOAT

pyarrow.lib.FloatArray

DOUBLE

pyarrow.lib.DoubleArray

TIMESTAMP

pyarrow.lib.TimestampArray

BLOB

pyarrow.lib.BinaryArray

  • 取得対象に空間型(GEOMETRY)もしくは配列型を含む場合はエラーとなります。

サンプルコード一覧

サンプルコードの一覧は以下の通りです。

作業フォルダにサンプルコードと/usr/share/java上のJarファイルをコピーして、ご利用ください。

  • gridstore-jdbc.jar

  • gridstore-arrow-jdbc.jar

※ Windows系のOSの場合は、startJVMメソッドのclasspath部分にコピーしたjarファイルのパスを指定してください。

基本編(basicフォルダ)

ファイル名

概要

sampleSimple.py

単純なSQLの実行例

sampleParametered.py

execute()によるプレースホルダ付きSQLの実行例

sampleMany.py

executemany()によるプレースホルダ付きSQLの実行例

sampleTypes.py

数値/BOOL型の例

sampleTimestamp.py

TIMESTAMP型の例

sampleTimestamp2.py

TIMESTAMP型(マイクロ秒/ナノ秒精度)の例

応用編(customフォルダ)

ファイル名

概要

sampleTimestamp2-Nano.py

TIMESTAMP型のナノ秒精度でのデータ取得の例

sampleTypes-IntFloat.py

Pythonのint/float型でのデータ取得の例

sampleBlob.py

BLOB型のデータ設定の例

結果取得の高速化(arrowフォルダ)

ファイル名

概要

sampleArrowIteratorAll.py

全件一括取得の例

sampleArrowIterator.py

全件分割取得の例