Rainbow Planet (GT×IT×SP×SA)

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

01_IT技術 (Technology)

PythonでSQLAlchemyを使ってOracleDBに接続する方法

投稿日:

(0)目次&概説

(1) 記事の目的
 (1-1) 目的
 (1-2) 前提条件
(2) 事前準備
 (2-1) 準備1(cx_oracleパッケージの導入)
  (2-1-1) インストール資源の入手
  (2-1-2) インストール
 (2-2) 準備2(Oracle Instant Clientの導入)
  (2-2-1) Oracle Instant Clientの導入
  (2-2-2) Visual Studio再頒布可能パッケージ
(3) サンプルプログラム
 (3-1) サンプルプログラムの紹介
 (3-2) サンプルプログラムの補足説明

(1) 記事の目的

(1-1) 目的

この記事はWindows ServerのPythonモジュールからLinuxサーバーにあるOracleデータベースへ接続するための方法を書いています。
(図100)

目次にもどる

(1-2) 前提条件

前提1:APサーバーにPython/PyScripterのインストールが完了している事
前提2:DBサーバーにOracleデータベースのインストールが完了している事

お使いのサーバーがLinuxOSで、もしOracleDBのインストール等でお困りの場合は下記の記事も参照ください。
■DBインストール
 ■Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その1)
 ■Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その2)
 ■Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その3)
 ■Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その4)
■表領域・スキーマ作成
 ■OracleDB11g で新規表領域とスキーマの作成

目次にもどる

(2) 事前準備

PythonでOracleDBに接続するには「cx_Oracle」や「Oracle Instant Client」のインストールが必要です。

「cx_Oracle」はPythonのDBAPIの仕様に基づいた拡張モジュールで、PythonからOracleDBへの接続を可能にするドライバの役割を果たします。OracleDBへ繋ぐ場合は、まずはこのパッケージを導入します。

「Oracle Instant Client」はOracleDBにリモート接続する際に必要となるライブラリなどをパッケージ化したものです。またOracle Instant Clientは動作のために「Visual Studio」の再頒布可能パッケージが必要なため、そちらも合わせてインストールします。

「Visual Studio 再頒布可能パッケージ」とは、あるバージョンのVS(Visual Studio)で開発されたアプリを、そのバージョンのVSがインストールされていない端末でも動かすために必要な、ランタイムのライブラリを集めたパッケージです。

それぞれの関係性を簡単な図で書くと次のようになります。
(図101)

(2-1) 準備1(cx_oracleパッケージの導入)

(2-1-1) インストール資源の入手

PyPIのサイトから資源をダウンロードして、サーバの任意のディレクトリに配置します。
Pythonのバージョンは3.7でサーバのOSはWindows64bitなので「win_amd64」を選択します。
https://pypi.org/project/cx-Oracle/#files

(図211)

(2-1-2) インストール

コマンドプロンプト等から「pip」コマンドを使ってインストールを行います。
「PermissionError」等が出ないようにコマンドプロンプトは管理者権限で起動します。cmdが起動したら、先ほどの資源が置いてあるパスに「cd」コマンドで移動し、次の「pip」コマンドでインストールを実行します。

cd [資源の配備先ディレクトリ]
pip install cx_Oracle-7.3.0-cp37-cp37m-win_amd64.whl

(図212)

↓インストール成功

目次にもどる

(2-2) 準備2(Oracle Instant Clientの導入)

(2-2-1) Oracle Instant Clientの導入

(1) 資源ダウンロード
Oracleのサイトから「Oracle Instant Client」ライブラリをダウンロードします。
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html

(図221)

(2) 解凍
任意のパスでzipファイルを解凍します。解凍すると「instantclient_XX_X」(XXはバージョン情報)といった名前のフォルダが作成されます。
(図222)

↓解凍するとディレクトリが作成される

(3) パスを通す
まずはパス設定をする画面を下記の手順で開きます。
「コントロールパネル」→「システム」→「システムの詳細設定」→「環境変数」→「システム環境変数」から「Path」を選択し、新規追加で上記の「instantclient_XX_X」のパスを追加します。

(図223)
コントロールパネル→システム

↓左ペインの「システムの詳細設定」を押下

↓「環境変数」を押下

↓下ペインの「システム環境変数」から「Path」を選択

↓「新規」で先ほど解凍によって出来た「instantclient_XX_X」のパスを指定して追加します。

(4) Oracleで使うフォルダの作成
「instantclient_XX_X」の配下に「network」という名前のフォルダを作成し、更にその配下に「admin」という名前のフォルダを作成します。
(図224)

installclient_19_5
 ∟network
  ∟admin

目次にもどる

(2-2-2) Visual Studio再頒布可能パッケージ

(1) 資源のダウンロード
Visual Studioの再頒布可能パッケージをダウンロードします。どのバージョンをダウンロードすれば良いかを下記の表にまとめていますし、下記のOracleのサイトからも確認ができます。
https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

Oracle Clientのバージョン 要求バージョン
Oracle 19 VS 2017
Oracle 18 and 12.2 VS 2013
Oracle 12.1 VS 2010
Oracle 11.2 VS 2005 64-bit
VS 2005 32-bit

(図225)
私のOracleバージョンは19でWindows64bitOSのため「vc_redist.x64.exe」を選択

(2) インストール
ダウンロードした「.exe」ファイルを実行してインストールします。
(私の場合、既にインストールされていたためインストールのキャプチャが取れず・・)

(図225)
既にインストール済みでした・・

(3) フォルダの権限変更
“Oracle Instant Client”が配備されているフォルダの権限が不足していたら追加します(Pythonを動かすOSユーザにOracle Instant Clientの実行権限があるか?など)

目次にもどる

(3) サンプルプログラム

(3-1) サンプルプログラムの紹介

このサンプルプログラムではOracleデータベースに接続して「BUSINESS」というテーブルのレコードをSELECTしています。
こちらの記事「PythonのdatapackageとSQLAlchemy、SQLiteを使ってcsvデータをSELECTする」で紹介しているサンプルプログラムと似ていますが、前回と大きく異なる点は”create_engine”で接続するデータベースがSQLiteではなくOraleである点です。

def main():

    from sqlalchemy import create_engine
    engine = create_engine('oracle://[your schema]:[your password]@[hostname]:[port]/[SID]',encoding='utf-8')
    results = engine.execute('SELECT * FROM BUSINESS')
    for row in results:
        print(row)

if __name__ == '__main__':
    main()

■実行結果の例
(図322)
リスト形式で「[(a,b,c,d),(a,b,c,d),(a,b,c,d),(a,b,c,d)]のように出力される

目次にもどる

(3-2) サンプルプログラムの補足説明

(1) create_engineの引数
create_engineの引数がOracleデータベースの場合は上記のように「oracle://[スキーマ名]:[パスワード]@[ホスト名]:[ポート番号]/[SID]となります。SIDはOracleデータベースのインスタンスの名称です。
例:engine = create_engine(‘oracle://scott:tiger@127.0.0.1:1521/sidname’)

(2) ResultProxy型の結果取得
SQLの実行結果(ResultProxy型)のデータについて、上記の例ではfor文を用いて各行を取得していますが、次の例の「fetchall()」は一括で取得できます。

def main():
    from sqlalchemy import create_engine
    engine = create_engine('oracle://[your schema]:[your password]@[hostname]:1521/[SID]',encoding='utf-8')
    results = engine.execute('SELECT * FROM BUSINESS')
    print(results.fetchall())

if __name__ == '__main__':
    main()

■実行結果(例)
(図321)各行が順番に出力される

(3) ResultProxy型の結果取得2
SQLの実行結果(ResultProxy型)のデータについて、取得行数について自分で指定して取得する場合に「fetchmany([取得件数])」を使います。

def main():
    from sqlalchemy import create_engine
    engine = create_engine('oracle://[your schema]:[your password]@[hostname]:1521/[SID]',encoding='utf-8')
    results = engine.execute('SELECT * FROM BUSINESS')
    print(results.fetchmany(3))

if __name__ == '__main__':
    main()

■実行結果(例)
(図323)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-01_IT技術 (Technology)

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

APサーバ(Java)⇒DBサーバ(OracleDB 11g)へJDBC接続する方法まとめ

(0)目次 (1) 前提条件 (2) JDBCドライバーのインストール  (2-1) JDBCドライバーをダウンロード  (2-2) APサーバにアップロード・解凍 (3) プログラムの実装  (3- …

PythonのdatapackageとSQLAlchemy、SQLiteを使ってcsvデータをSELECTする

(0)目次&概説 (1) 今回の目的  (1-1) 目的  (1-2) 前提条件 (2) 実施手順  (2-0) 事前作業  (2-1) データ(csv)のロード  (2-2) エンジンの作成  (2 …

OracleDB11gのキャラクタセットを変更する手順について(概要編)

(0)目次&概説 (1) 記事の目的  (1-1) 目的  (1-2) 前提条件   (1-2-1) 「props$」更新はNG   (1-2-2) 10g以降は”ALTER DATABA …

JSPとは?役割や基本文法およびHelloWorldのサンプルプログラムの紹介

(0)目次&概説 (1) JSPの基本  (1-1) JSPとは?  (1-2) JSPのHelloWorld (2) JSPの基本文法  (2-1) ディレクティブ  (2-2) アクションタグ   …

Servlet/JSPで日本語文字が「???」になる問題とFilterの活用について

(0)目次&概説 (1) 事象 (2) 原因 (3) 対処方法1  (3-1) フィルタクラスの新規作成  (3-2) フィルタクラスへのコード追加  (3-3) 疎通確認テスト (4) 対処方法2 …

Top