連載目次
cx_Oracle8.1リリース
cx_Oracle 8.1がリリースされました。
以前のリリースの記事以降解説をすっ飛ばした8.0.1も含め、新機能、変更点などを解説します。
1. 利用ODPI-Cのバージョンの変更(8.0.1/8.1)
8.0はODPI-C 4.0.1をベースに開発されていました。8.0.1では4.0.2を、8.1では4.1.0をベースに開発されています。
2. 39~40桁のNUMBER型のハンドリングの不具合の修正(8.0.1)
cx_Oracleといよりは元となるODPI-Cの不具合の模様ですが、39~40桁のNUMBER型をcx_Oracleでやり取りする際に「cx_Oracle.DatabaseError: DPI-1044: value cannot be represented as an Oracle number」というエラーになる問題が発生していたのが修正されました。
以下、「NUMBER型って最大38桁じゃないの?」という疑問を持った方への解説です。
桁数を指定していないNUMBER型は、最大38桁の精度の数値を格納することが可能です。もう少し言い換えると、桁数指定をしていないNUMBER型は38桁を超える数値もハンドリングすることが可能です。しかし、精度は最大38桁なので、値が正しく入るのは最初の38桁までです。100桁を例にすると、上から38桁目までは値が入っていますが、下62桁はゼロになります。
3. setup.pyの変更(8.0.1)
8.0でサポート対象外となったPython2系へのインストールがエラーになるよう修正されました。
4. サポート対象Pythonバージョンの変更(8.1)
8.0.1まではPython3.5以上となっていましたが、2020年9月30日にPython 3.5自体のサポート期間が終了したため、8.1では3.5への対応が廃止され、3.6以降の対応となりました。また、Python 3.9がサポートされました。
5. ネイティブJSON型への対応(8.1)
Oracle Databaseは12cよりJSONをサポートしていますが、格納データ型はVARCHAR2のような既存の可変長文字列型でした。21cより、ネイティブなJSON型がサポートされました。DBのデータ型の名称は、そのまんま「JSON」です。cx_Oracleのデータ型名は「cx_Oracle.DB_TYPE_JSON」です。「ネイティブ」といっているのは、MongoDBで言うBSONのように、内部的にバイナリ化して保存し、アクセス速度を高めているからです。Oracleなので「OSON」と言ったりします。
cx_Oracle8.1より21cのJSON型に対応しました。SQLアクセスだけではなく、SODA APIも対応しています。
6. 未対応OCI属性の取得API(8.1)
元々cx_Oracleで対応していないOCIの属性を取得、設定できるインターナルなメソッドが追加されました。ただし、インターナルですし、リリースノートには「These methods should only be used as directed by Oracle.」とあるので、あまり一般的に利用されることは想定していないようです。
ここでは「OCI」はOracle Cloud Infrastructureではなく、Oracle Call Interfaceのことです。Oracle Call InterfaceはOracle Databaseへの最下層のアクセスAPIです。cx_Oracleの元となるODPI-CがOCIを利用して作成されています。ODPI-CはOCIが提供するすべての機能を網羅してはいません。結果、ODPI-Cに依存しているcx_Oracleもその制限を受けます。その制限を、属性へのアクセスについては回避できる手段ができた、ということだと思われます。
7. Alex Henrie氏のコード品質改善のpull requestの受け入れ
この方、8.0の際にも貢献してくださっていますね。
8. setup.pyの改善(8.1, タイトルのみ)
9. prefetchrowの仕様変更(8.1)
REF_CURSOR型の変数が優先されるようになりました。
10. データ型のシリアライズが復活(8.1)
pickleモジュールを使用したcx_Oracleデータ型のシリアライズが再度できるようになりました(解釈に自信なし)
11. tox対応(8.1)
toxを使用したテストに対応しました。
12. その他
ドキュメントの改善が行われています。