2020/6/26(日本時間)にcx_Oracleが7.3から8.0にバージョンアップされました。
以下、8.0の新機能、変更点のおおまかな解説です。メジャーバージョンアップだけあって、大きな(と筆者が感じる)変更が含まれています。以下、番号はcx_Oracleのリリースノートに対応しています。
1. Python2のサポート終了
サポートするPythonのバージョンが3.5以降となりました。Python2で利用したい場合は7.3を使用する必要があります。
2. ODPI-Cのバージョン変更
cx_OracleはODPI-CというOSSのC言語のOracleアクセスドライバを用いて作成されています。バージョン8.0は、ODPI-C 4.0.1をベースにビルドされています。
3. 型マネジメントの変更
以下の通り、大幅に見直されています。
- 型の定数の体系が以下の通りに整理されました。
- DB API Type : DB APIに準拠した型
- Database Type : Oracle Databaseのデータ型に対応した型。7.3と名称が異なる
- Database Type Synonym : 7.3時代の型。8.0以降は非推奨で将来廃止予定
- Other Type : 上記に含まれない型
- 7.3では一部のOralce Databaseデータ型に対し、対応するcx_Oracleデータ型定数が存在しませんでした。8.0で不足していたデータ型への対応として、以下を追加しています。
- cx_Oracle.DB_TYPE_BINARY_FLOAT
- cx_Oracle.DB_TYPE_INTERVAL_YM
- cx_Oracle.DB_TYPE_TIMESTAMP_LTZ
- cx_Oracle.DB_TYPE_TIMESTAMP_TZ
- Variableオブジェクトのtype属性に対する変更
- Oracle Databaseのオブジェクト型にバインドされていない場合、NoneではなくDatabase Typeを使用するように変更
- LOBに対応
- Oracle Databaseのオブジェクト型の属性を取得可能に
- Object Typeオブジェクトにelement_type属性を追加
- 同一セッションないしコネクションプール使用時において、Object Typeオブジェクトの名前やスキーマの比較が可能に
- すべての変数が同一クラスのインスタンスとなった
- 変数の文字列表現に、値に加えて型が追加
4. cx_Oracle.init_oracle_client()の追加
Oracle Clientライブラリの初期化を行う関数cx_Oracle.init_oracle_client()が追加されました。
5. デフォルトエンコーディングの変更
7.3ではNoneでしたが、8.0ではUTF-8になりました。NLS_LANG環境変数のキャラクタのセットの指定は無視されます。
6. Soda Documentクラスへのメソッド追加
SodaCollectionオブジェクトにsave(), saveAndGet(), truncate()メソッドが追加されました。これらの機能を利用するためには、Oracle Client 20以降が必要です。
7. SodaOperation.fetchArraySize()の追加
SODAドキュメントのフェッチ件数を設定するSodaOperation.fetchArraySize()が追加されました。この機能を利用するためには、Oracle Client 19.5以降が必要です。
8. Cursor.prefetchrowsの追加
結果セットのプリフェッチを行うCursor.prefetchrowsが追加されました。
9. Connection.versionの初回実行に伴うラウンドトリップの回避
データベースのバージョン番号を取得するConnection.versionの初回実行に伴うラウンドトリップを回避するために、新しいモードの追加行っています。この機能を利用するためには、Oracle Client 20以降が必要です。
10. PFILE対応
PFILEを使用したデータベースの起動に対応しました。7.3まではSPFILEのみの対応でした。
11. Cursor.getbatcherrors()のバッファオーバーフローの修正
オフセットが65536を超えた場合、Cursor.getbatcherrors()でバッファオーバーフローが発生する問題を修正しました。
12. Cursor.lastrowidの挙動の変更
INSERT ALL文を実行した後にCursor.lastrowidを実行した場合にエラーが発生しないように変更されました。
13. Alex Henrie氏のpull requestの受け入れ
主にコードの改善(冗長なコーディングの改善等)に関する6つのpull requestを取り込んでいます。
14. boolean変数にバインドされたPythonオブジェクトの挙動
boolean変数にバインドされたPythonオブジェクトは、Pythonのif文の中でTrueかFalseとみなされるかに従ってTrue/Falseに変換されるようになりました。従来はTrueのみTrueに変換され、それ以外はFalseに変換されていました。
15. 本体コード以外の改善
ドキュメント、サンプル、テストを改善しています。
変更履歴
- 2020/12/12 : 誤字修正