この章では、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 jaydebeapi

CData 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:datavirtuality:<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:datavirtuality:datavirtuality@mms://localhost:31001 as url

[admin, admin] as driver_args

"C:/datavirtuality/jdbc/datavirtuality-jdbc.jar" as jars,

jaydebapi 経由でCData Virtuality Server に接続するコードはこのようになります:

import jaydebeapi
 
jaydebeapi.connect(com.datavirtuality.dv.jdbc.Driver, jdbc:datavirtuality: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 Details
host = "localhost"
port = "31001"
database = "datavirtuality"
use_ssl = True
uid = "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 string
if (use_ssl):
connection_string="jdbc:datavirtuality:{}@mms://{}:{}".format(database, host, port)
else:
connection_string="jdbc:datavirtuality:{}@mm://{}:{}".format(database, host, port)
# Establish JDBC connection
con = 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 pyodbc
 
con = 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

python code
import pyodbc
 
# Data Virtuality Server Details
host = "localhost"
port = "35433"
database = "datavirtuality"
sslmode = "require"
uid = "admin"
pwd = "admin"
 
# Data Virtuality ODBC driver name
driver = "DataVirtuality Unicode(x64)"
 
# ODBC connection string
con_string = "driver={}; server={}; port={}; database={};sslMode={}; uid={}; pwd={};".format(driver, host, port, database, sslmode, uid, pwd)
 
# Establish ODBC connection
con = 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 psycopg2
 
con = 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()
Full Example
import psycopg2
 
# Data Virtuality Server Details
host = "localhost"
port = "35433"
database = "datavirtuality"
sslmode = "require"
uid = "admin"
pwd = "admin"
 
# psycopg2 connection string
con_string = "dbname={} user={} host={} password={} port={} sslmode={}".format(database, uid, host, pwd, port, sslmode)
 
# Establish connection
con = psycopg2.connect(con_string)
cur = con.cursor()
cur.execute("select * from <schema>.<table>")
cur.fetchall()

Limitations

psycopg2の使用にはいくつかの制限があります。mogrifyメソッドを使っていることに注意してください。基本的に、executemogrifyに置き換えるだけで、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);"