この章では、Python スクリプトとCData Virtuality Server 間の相互作用を可能にするいくつかの方法について説明します。
Access CData Virtuality Server from Python using JDBC Driver and JayDeBeApi
JayDeBeApi
JayDeBeApiモジュールを使うと、Python コードから Java JDBC ドライバーと接続文字列を使ってさまざまなデータベースに接続できます。CData Virtuality Server へのPython DB-API v2.0 を提供します。
モジュールはpipでインストールできます:
$ pip install jaydebeapiCData Virtuality JDBC Driver
CData Virtuality JDBC Driver は CData Virtuality Server インスタンスまたは CData Virtuality Driver download areaから入手できます。
JDBCドライバーを使用して接続するには、ベンダー固有のドライバークラスとJDBC URLが必要です。
CData Virtuality Server の場合は以下のとおりです:
ドライバークラスcom.datavirtuality.dv.jdbc.Driver
JDBC URL:jdbc:cdatavirtuality:<Virtual Database>@mm[s]//<host>:<port>;
URLの構成要素は以下のとおりです:
- <
virtual database> - 接続先の 仮想データベース (VDB)の名前。複数のVDB を使用する場合を除き、VDB の名前は "datavirtuality" です。 mm- SSL を使用しない接続のためのCData Virtuality JDBC プロトコルmms- SSL を使用する接続のためのCData Virtuality JDBC プロトコル- <
host> - CData Virtuality Server アドレス。 - <
port> - JDBC 接続を受信するCData Virtuality Server ポート。デフォルトでは、SSLを使用する接続用のポートは31001、SSLを使用しない接続用のポートは31000です。
Connect to CData Virtuality Server
jaydebeapi.connect()
jaydebeapi.connect()メソッドには以下のシグネチャーがあります:
jaydebeapi.connect(jclassname, url, driver_args, jars, libs)Providing:
com.datavirtuality.dv.jdbc.Driver as jdbclassname
jdbc:cdatavirtuality:datavirtuality@mms://localhost:31001 as url
[admin, admin] as driver_args
"C:/datavirtuality/jdbc/datavirtuality-jdbc.jar" as jars,
jaydebapi 経由でCData Virtuality Server に接続するコードはこのようになります:
import jaydebeapijaydebeapi.connect(com.datavirtuality.dv.jdbc.Driver, jdbc:cdatavirtuality:datavirtuality@mms://localhost:31001, [admin, admin], "C:/datavirtuality/jdbc/datavirtuality-jdbc.jar") cur = con.cursor()cur.execute("select * from <schema>.<table>")cur.fetchall()
Full sample
import jaydebeapi # Data Virtuality Server Detailshost = "localhost"port = "31001"database = "datavirtuality"use_ssl = Trueuid = "admin"pwd = "admin" # Data Virtuality JDBC class name driver_class = "com.datavirtuality.dv.jdbc.Driver" # Data Virtuality Server driver file (full path)driver_file = "C:/datavirtuality/jdbc/datavirtuality-jdbc.jar" # JDBC connection stringif (use_ssl): connection_string="jdbc:cdatavirtuality:{}@mms://{}:{}".format(database, host, port)else: connection_string="jdbc:cdatavirtuality:{}@mm://{}:{}".format(database, host, port) # Establish JDBC connectioncon = jaydebeapi.connect(driver_class, connection_string, [uid, pwd], driver_file,)cur = con.cursor()cur.execute("select * from <schema>.<table>")cur.fetchall() Access CData Virtuality Server from Python Using CData Virtuality ODBC Driver and pyodbc
pyodbc
pyodbcモジュールにより、Python コードから ODBC ドライバーを使用してさまざまなデータベースに接続できます。これはCData Virtuality Server に a Python DB-API v2.0 を提供します。
モジュールはpipでインストールできます:
$ pip install pyodbcバイナリビルドはWindowsとmacOSのほとんどのバージョンでリリースされています。
Linuxにpyodbcをインストールする場合、 pip はpyodbcのソースコードをダウンロードしてコンパイルします。このため、コンパイルが成功するためには、いくつかの関連コンポーネントとソース・ファイルが利用可能である必要があります。特定のLinuxディストリビューションのニーズについては、最新のpyodbc documentationを参照してください。
CData Virtuality ODBC Driver
CData Virtuality ODBC Driver は、CData Virtuality Server に接続するPython プログラムを実行するシステムにインストールする必要があります。
ドライバーはCData Virtuality Server インスタンスから取得できます。CData Virtuality Driver download areaからドライバーのWindows インストーラーを入手することもできます。
Windows、Linux、macOS 用の詳細なドライバーインストール手順は、CData Virtuality Administration Guide に記載されています。
Connect to CData Virtuality Server
pyodbc.connect()
import pyodbccon = pyodbc.connect("driver={DataVirtuality Unicode(x64)}; server=localhost; port=31001; database=datavirtuality;sslMode=require; uid=admin; pwd=admin;") cur = con.cursor()cur.execute("select * from <schema>.<table>")cur.fetchall()Full sample
import pyodbc# Data Virtuality Server Detailshost = "localhost"port = "35433"database = "datavirtuality"sslmode = "require"uid = "admin"pwd = "admin" # Data Virtuality ODBC driver namedriver = "DataVirtuality Unicode(x64)" # ODBC connection stringcon_string = "driver={}; server={}; port={}; database={};sslMode={}; uid={}; pwd={};".format(driver, host, port, database, sslmode, uid, pwd)# Establish ODBC connectioncon = pyodbc.connect(con_string)cur = con.cursor()cur.execute("select * from <schema>.<table>")cur.fetchall()Access CData Virtuality Server from Python Using psycopg2
Python コードから CData Virtuality Server に接続するもう一つの方法はpsycopg2 moduleです。PostgreSQLプロトコルを使用し、マルチスレッドの多いアプリケーション用に特別に設計されています。
開発やテストの目的のために、PyPI から psycopg2-binary パッケージをインストールすることで、コンパイラや外部ライブラリを必要としないスタンドアロンパッケージを入手できます:
$ pip install psycopg2-binary本番環境では、psycopg2 documentationの「DESCRIBE インストール」のセクションで詳しく説明されているように、ソースからビルドしたパッケージを使用することをお勧めします。
Connect to CData Virtuality Server
CData Virtuality Server とPostgreSQL は言語を共有している部分があるため、psycopg2 を使用することでCData Virtuality Server へのアクセスを簡単に設定することができます。CData Virtuality Server に送信するプレーンSQL ステートメントで使用できます。
psycopg2.connect()
import psycopg2con = psycopg2.connect("dbname=datavirtuality user=admin host=localhost password=admin port=35433 sslmode=require")cur = con.cursor()cur.execute("select * from <schema>.<table>")cur.fetchall()import psycopg2 # Data Virtuality Server Detailshost = "localhost"port = "35433"database = "datavirtuality"sslmode = "require"uid = "admin"pwd = "admin"# psycopg2 connection stringcon_string = "dbname={} user={} host={} password={} port={} sslmode={}".format(database, uid, host, pwd, port, sslmode)# Establish connectioncon = psycopg2.connect(con_string)cur = con.cursor()cur.execute("select * from <schema>.<table>")cur.fetchall()Limitations
psycopg2の使用にはいくつかの制限があります。mogrifyメソッドを使っていることに注意してください。基本的に、executeをmogrifyに置き換えるだけで、executeによってデータベースに送られる文字列を正確に返します。
In: import datetime ...: import psycopg2 ...: ...: host = "localhost" ...: port = "35433" ...: database = "datavirtuality" ...: sslmode = "require" ...: uid = "admin" ...: pwd = "admin" ...: ...: dt = datetime.datetime.now() ...: ...: ...: conn_string = "dbname={} user={} host={} password={} port={} sslmode={}".format(database, uid, host, pwd, port, sslmode) ...: ...: conn = psycopg2.connect(conn_string) ...: cur = conn.cursor() ...: ...: cur.mogrify("SELECT %s, %s, %s;", (dt, dt.date(), dt.time()))Out: b"SELECT '2019-11-08T17:58:59.910677'::timestamp, '2019-11-08'::date, '17:58:59.910677'::time;"ステートメント"SELECT %s, %s, %s;", (dt, dt.date(), dt.time())において、プレースホルダはPython によって(dt, dt.date(), dt.time()). 経由で埋められます。その結果、 ::dateと ::timeがCData Virtuality Server に送信され(この例ではmogrifyによってプリントアウトされ)、ステートメントが解析され理解されるのを妨げます。したがって、このようなステートメントは psycopg2 では使用できません。しかし、次の文は問題なく動作します:
cur.mogrify("SELECT cast(now() as timestamp), cast(now() as date), cast(now() as time);"JDBC connection string changed in v4.10: both jdbc:datavirtuality and jdbc:cdatavirtuality are acceptable