この章では、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
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()
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
メソッドを使っていることに注意してください。基本的に、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);"