今回はPythonからOracle データベースに接続し、データを更新したり取得する方法について解説します。
趣味で本格的なデータベースを使うことは無いとは思いますので、あくまでも仕事で必要に迫られたという前提です。
Oracleというデータベースについて基本的な知識があり、Pythonから接続する方法を知りたいという方が対象の記事になっています。
接続する前の準備
Python から Oracleに接続するには、次の手順が必要です。
- Oracle インスタントクライアントのインストール
- Pythonのcx_Oracle パッケージのインストール
- Pythonプログラム上で cx_Oracle のインポート
OracleインスタントクライアントはOracle接続するための最小構成のドライバーであるため、他のOracle接続ツールをインストールしている場合や、Oracleに接続する他のアプリケーションがインストールされている環境においては、Oracle インスタントクライアントを入れなくても良い可能性があります。
Oracleインスタントクライアントのインストール
Oracle インスタントクライアントは Oracle公式のダウンロードペーシ(下図左)からダウンロードできます。
Windows版のインスタントクライアントは Windows用のダウンロードページ(下図右)から直接ダウンロードできます。
Windows用については、2021年9月の時点では下記が最新のインストーラーになります。
instantclient-basic-windows.x64-19.12.0.0.0dbru.zip
ダウンロードした zip ファイルを任意のフォルダに解凍した後で、Windows環境変数のPATHに解凍先のパスを登録するだけで完了です。
cx_Oracle のインストール
Python公式サイトからPythonをダウンロードして使っている方は、DOSプロンプトから下記コマンドを実行します。
1 |
pip install cx_Oracle |
AnacondaやMinicondaでPythonをインストールして使っている方DOSプロンプトから下記コマンドを実行します。
1 |
conda install cx_Oracle |
Oracleに接続し、SQLを実行するための手順
SQLやDDLを実行するためには、次の手順を実行します。
この手順は SQLite、PostgreSQL、SQLServer などの他のデータベースと同じです。
1 |
import cx_Oracle |
Oracleへの接続
Oracleに接続するためには、次のメソッドを実行します。
PostgreSQLやSQLServer の場合は connect メソッドから始まるのですが、Oracle だけは makedsn を使って tns (Transparent Network Substrate) オブジェクトを生成し、connect メソッドに渡す必要があります。
tns とは、Oracleが命名したDB接続用インターフェース技術の名前です。
1 2 3 4 |
#Oracle接続のサンプル import cx_Oracle tns = cx_Oracle.makedsn('myserver', 1521, service_name = 'orcl') conn = cx_Oracle.connect('yamada','h98#3a2p@7',tns) |
ちなみに、tns は makedsn を使わなくても、下記の様に文字列で記述することも可能です。
1 2 3 |
tns=" (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = myserver)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))" conn = cx_Oracle.connect('yamada','h98#3a2p@7',tns) |
データの取得
Oracle に対して select 文を発行し、データを取得する方法は次のようになります。
fetch には次の3種類が用意されています。
機能 | メソッド | 備考 |
---|---|---|
全件取得 | fetchall() | リスト形式で全件を返す。 |
1件づつ取得 | fatchone() | データがあれば1行をタプル形式で返す。 データが無くなれば None を返す。 |
指定件数づつ取得 | fetchmeny(件数) |
下記はOracle に接続し、条件に一致したデータを全件取得するサンプルです。
1 2 3 4 5 6 7 8 9 10 |
import cx_Oracle tns = cx_Oracle.makedsn('myserver', 1521, service_name = 'orcl') conn = cx_Oracle.connect('yamada','h98#3a2p@7',tns) cur = conn.cursor() cur.execute('select * from hoge where id >= 10000') res = cur.fetchall() print(res) cur.close() conn.close() |
データの更新、DDLの実行
データの更新やDDLの実行は次のようになります。
トランザクションの開始は、最初のSQL実行時に自動で行われますので、特に明示的に記述する必要はありません。
もし何らかの都合で明示的に記述したい場合は、conn.begin() と記述します。
トランザクションが自動で開始されるということは、明示的にトランザクションを完了させないとデータは更新されません。
トランザクションの完了は、conn.commit() を、ロールバックしたい場合は conn.rollback() メソッドを呼び出します。
DDLはロールバックが効かないので、commit() は必要ありませんが、commit() をしてもエラーにはなりません。
下記はinsertのサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 |
import cx_Oracle tns = cx_Oracle.makedsn('myserver', port=1521, service_name = 'orcl') conn = cx_Oracle.connect('yamada','h98#3a2p@7',tns) cur = conn.cursor() cur.execute('insert into hoge(id,tag,cost) values('10001','ABCD',120)' cur.execute('insert into hoge(id,tag,cost) values('10002','BCDE',250)' cur.execute('insert into hoge(id,tag,cost) values('10003','CDEF',380)' conn.commit() cur.close() conn.close() |
下記はDDLのサンプルです。
1 2 3 4 5 6 7 8 |
import cx_Oracle tns = cx_Oracle.makedsn('myserver', port=1521, service_name = 'orcl') conn = cx_Oracle.connect('yamada','h98#3a2p@7',tns) cur = conn.cursor() cur.execute('create table mage(startday timestamp,item varchar2(100),val number(10,2))') cur.close() conn.close() |
まとめ
今回は Python を使って Oracle に接続するために必要な Oracle インスタントクライアント、及び cx_Oracleのインストール方法と、Oracleに接続した後にデータの抽出や更新を行うための簡単なサンプルを紹介しまた。
Pythonのデータベース接続はデータベースの種類によって少しづつ異なりますが、接続してからの操作(データ抽出、データ更新、DDL発行)は同じです。
この記事がPythonでOracleに接続するための手助けになれば幸いです。
コメント