@@ -95,7 +95,8 @@ from cx_Oracle:
9595 - ``encoding `` and ``nencoding ``: The encodings in use are always UTF-8.
9696
9797 - ``threaded ``: Threaded Oracle Call Interface (OCI) is now always enabled
98- in Thick mode. This option is not relevant to the Thin mode.
98+ in python-oracledb Thick mode. This option is not relevant to the Thin
99+ mode.
99100
100101 See :ref: `deprecations ` for more information.
101102
@@ -115,11 +116,11 @@ The :ref:`Connection object <connobj>` differences between the python-oracledb
115116and cx_Oracle drivers are:
116117
117118- The attribute :attr: `Connection.maxBytesPerCharacter ` is deprecated. This
118- will return a constant value of 4 since encodings are always UTF-8.
119+ will return a constant value of * 4 * since encodings are always UTF-8.
119120
120121- A new boolean attribute, :attr: `Connection.thin ` is available. This
121- attribute is True if the connection was established in the Thin mode. In
122- Thick mode, the value of this attribute is False.
122+ attribute is * True * if the connection was established in python-oracledb Thin
123+ mode. In Thick mode, the value of this attribute is * False * .
123124
124125- The new method signature of :attr: `Connection.outputtypehandler ` is
125126 ``handler(cursor, metadata) ``. The old signature ``handler(cursor, name,
@@ -190,9 +191,9 @@ The SessionPool object (which is an alias for the :ref:`ConnectionPool object
190191 of ``cx_Oracle.SessionPool ``.
191192
192193- A new boolean attribute, ``SessionPool.thin `` (see
193- :attr: `ConnectionPool.thin `) is available. This attribute is True if the
194- connection was established in the Thin mode. In Thick mode, the value of
195- this attribute is False.
194+ :attr: `ConnectionPool.thin `) is available. This attribute is * True * if the
195+ connection was established in python-oracledb Thin mode. In Thick mode, the
196+ value of this attribute is * False * .
196197
197198Cursor Object Differences from cx_Oracle
198199----------------------------------------
@@ -211,15 +212,15 @@ python-oracledb and cx_Oracle drivers are:
211212
212213- ``Cursor.executemanyprepared() ``: This method was previously deprecated in
213214 cx_Oracle 6.4 and has been removed in python-oracledb. Instead, use
214- :meth: `Cursor.executemany() `, by passing None for the statement argument and
215+ :meth: `Cursor.executemany() `, by passing * None * for the statement argument and
215216 an integer for the parameters argument.
216217
217218- ``Cursor.bindarraysize ``: This attribute is desupported and removed in
218219 python-oracledb. It is not needed in the application code.
219220
220221- :attr: `Cursor.rowcount `: After :meth: `Cursor.execute() ` or
221222 :meth: `Cursor.executemany() ` with PL/SQL statements, ``Cursor.rowcount ``
222- will return 0 . If the cursor or connection are not open, then the value -1
223+ will return * 0 * . If the cursor or connection are not open, then the value * -1 *
223224 will be returned as required by the Python Database API.
224225
225226- :attr: `Cursor.description `: This attribute was previously a sequence of
@@ -393,18 +394,18 @@ to python-oracledb:
393394
394395 See :ref: `driverdiff `.
395396
396- - The python-oracledb Thin and Thick modes have the same level of support for
397+ - python-oracledb Thin and Thick modes have the same level of support for
397398 the `Python Database API specification <https://peps.python.org/pep-0249/ >`_
398399 and can be used to connect to on-premises databases and Oracle Cloud
399- databases. However, the python-oracledb Thin mode does not support some of
400- the advanced Oracle Database features such as Application Continuity (AC),
401- Advanced Queuing (AQ), Continuous Query Notification (CQN), and Sharding.
402- See :ref: ` Features Supported <featuresummary >` for details.
400+ databases. However, python-oracledb Thin mode does not support some
401+ advanced Oracle Database features such as Application Continuity (AC),
402+ Continuous Query Notification (CQN), and Sharding. See :ref: ` Features
403+ Supported <featuresummary>` for details.
403404
404405- python-oracledb can be used in SQLAlchemy, Django, Pandas, Superset and other
405406 frameworks and Object-relational Mappers (ORMs). To use python-oracledb in
406- versions of these libraries that don't have native support for the new name,
407- you can override the use of cx_Oracle with a few lines of code. See
407+ older versions of these libraries that do not have native support for the new
408+ name, you can override the use of cx_Oracle with a few lines of code. See
408409 :ref: `frameworks `.
409410
410411- python-oracledb connection and pool creation calls require keyword arguments
@@ -421,32 +422,8 @@ to python-oracledb:
421422
422423 oracledb.connect(" scott" , pw, " localhost/orclpdb" )
423424
424- - The python-oracledb Thin mode ignores all NLS environment variables. It
425- also ignores the ``ORA_TZFILE `` environment variable. Thick mode does use
426- these variables. See :ref: `globalization ` for alternatives.
427-
428- - To use a ``tnsnames.ora `` file in the python-oracledb Thin mode, you must
429- explicitly set the environment variable ``TNS_ADMIN `` to the directory
430- containing the file, or set :attr: `defaults.config_dir `, or set the
431- ``config_dir `` parameter when connecting.
432-
433- Only python-oracledb Thick mode will read :ref: `sqlnet.ora <optnetfiles >`
434- files. The Thin mode lets equivalent properties be set in the application
435- when connecting.
436-
437- Configuration files in a "default" location such as the Instant Client
438- ``network/admin/ `` subdirectory, in ``$ORACLE_HOME/network/admin/ ``, or in
439- ``$ORACLE_BASE/homes/XYZ/network/admin/ `` (in a read-only Oracle Database
440- home) are not automatically loaded in Thin mode. Default locations are
441- only automatically searched in Thick mode.
442-
443- - To use the python-oracledb Thin mode in an ORACLE_HOME database installation
444- environment, you must use an explicit connection string since the
445- ``ORACLE_SID ``, ``TWO_TASK ``, and ``LOCAL `` environment variables are not
446- used. They are used in Thick mode.
447-
448- - This is a major release so some previously deprecated features are no longer
449- available. See :ref: `deprecations `.
425+ - Some previously deprecated features are no longer available. See
426+ :ref: `deprecations `.
450427
451428.. _commonupgrade :
452429
@@ -501,7 +478,7 @@ following steps:
501478 You **must ** replace positional parameters with keyword parameters, unless
502479 only one parameter is being passed. Python-oracledb uses keyword parameters
503480 exclusively unless a DSN containing the user, password, and connect string
504- combined, for example ``un/pw@cs ``, is used. This change makes the driver
481+ combined, for example ``" un/pw@cs" ``, is used. This change makes the driver
505482 compliant with the Python Database API specification `PEP 249
506483 <https://peps.python.org/pep-0249/> `_.
507484
@@ -545,8 +522,8 @@ following steps:
545522 :data: `~oracledb.POOL_GETMODE_NOWAIT `. The new default value improves the
546523 behavior for most applications. If the pool is in the middle of growing,
547524 the new value prevents transient connection creation errors from occurring
548- when using the Thin mode, or when using the Thick mode with recent Oracle
549- Client libraries.
525+ when using python-oracledb Thin mode, or when using Thick mode with recent
526+ Oracle Client libraries.
550527
551528 If the old default value is required, modify any pool creation code to
552529 explicitly specify ``getmode=oracledb.POOL_GETMODE_NOWAIT ``.
@@ -557,36 +534,45 @@ following steps:
557534 as :data: `~oracledb.POOL_GETMODE_NOWAIT ` and :data: `~oracledb.PURITY_SELF `
558535 are now preferred. The old namespaces still work.
559536
560- 7. The method signature of the :ref: `output type handler <outputtypehandlers >`
561- which can be specified on a
562- :attr: `connection <Connection.outputtypehandler> ` or on a
563- :attr: `cursor <Cursor.outputtypehandler> ` is ``handler(cursor, metadata) ``.
564- The old signature ``handler(cursor, name, default_type, length, precision,
565- scale) `` was deprecated in python-oracledb 1.4 but will still work and will
566- be removed in a future version.
567-
568- 8. VARCHAR2 and LOB columns that have the ``IS JSON `` constraint enabled are
537+ 7. VARCHAR2 and LOB columns that have the ``IS JSON `` constraint enabled are
569538 fetched by default as Python objects in python-oracledb. In cx_Oracle,
570- VARCHAR2 and LOB columns that contain JSON data are fetched by default as
539+ VARCHAR2 and LOB columns that contain JSON data were fetched by default as
571540 strings and LOB objects respectively. See :ref: `fetchisjson `.
572541
573- 9. Review the following sections to see if your application requirements are
574- satisfied by the python-oracledb Thin mode:
542+ 8. Review :ref: `compatibility `.
543+
544+ If your code base uses an older cx_Oracle version, review the previous
545+ :ref: `release notes <releasenotes >` for additional changes to modernize
546+ the code.
547+
548+ 9. Modernize code as needed or desired.
549+
550+ For example, replace all usages of the deprecated Advanced Queuing API with
551+ the new API originally introduced in cx_Oracle 7.2, see
552+ :ref: `aqusermanual `.
553+
554+ The method signature of the :ref: `output type handler <outputtypehandlers >`
555+ which can be specified on a :attr: `connection
556+ <Connection.outputtypehandler> ` or on a :attr: `cursor
557+ <Cursor.outputtypehandler> ` is ``handler(cursor, metadata) ``. The old
558+ signature ``handler(cursor, name, default_type, length, precision, scale) ``
559+ was deprecated in python-oracledb 1.4 but will still work and will be
560+ removed in a future version.
561+
562+ See :ref: `deprecations ` for the list of all deprecations in python-oracledb.
563+
564+ 10. Review the following sections to see if your application requirements are
565+ satisfied by python-oracledb Thin mode:
575566
576567 - :ref: `featuresummary `
577568 - :ref: `driverdiff `
578569
579- If your application requirements are not supported by the Thin mode, then
580- use the python-oracledb Thick mode.
570+ If so, then follow :ref: `upgradethin `.
581571
582- 10. Review :ref: `compatibility `.
572+ If your application requirements are not supported by python-oracledb Thin
573+ mode, then use Thick mode, see :ref: `upgradethick `.
583574
584- If your code base uses an older cx_Oracle version, review the previous
585- :ref: `release notes <releasenotes >` for additional changes to modernize
586- the code.
587-
588- 11. Modernize code as needed or desired. See :ref: `deprecations ` for the list
589- of deprecations in python-oracledb.
575+ .. _upgradethin :
590576
591577Additional Upgrade Steps to use python-oracledb Thin Mode
592578+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -595,7 +581,7 @@ To use python-oracledb Thin mode, the following changes need to be made in
595581addition to the common :ref: `commonupgrade `:
596582
5975831. Remove calls to :func: `~oracledb.init_oracle_client ` since this turns on
598- the python-oracledb Thick mode.
584+ python-oracledb Thick mode.
599585
6005862. If the ``config_dir `` parameter of :func: `~oracledb.init_oracle_client ` had
601587 been used, then set the new :attr: `defaults.config_dir ` attribute to the
@@ -628,19 +614,34 @@ addition to the common :ref:`commonupgrade`:
628614
629615 See :ref: `otherinit `.
630616
631- 4. If the application is connecting using a :ref: `TNS Alias <netservice >` from
632- a ``tnsnames.ora `` file located in a "default" location such as the Instant
633- Client ``network/admin/ `` subdirectory, in ``$ORACLE_HOME/network/admin/ ``,
634- or in ``$ORACLE_BASE/homes/XYZ/network/admin/ `` (in a read-only Oracle
635- Database home), then the configuration file directory must now explicitly be
636- set as shown in Step 2.
637-
638- 5. Remove calls to :func: `oracledb.clientversion() ` which is only available in
639- the python-oracledb Thick mode. Oracle Client libraries are not available
617+ 4. Remove calls to :func: `oracledb.clientversion() ` which is only available in
618+ python-oracledb Thick mode. Oracle Client libraries are not available
640619 in Thin mode.
641620
642- 6. Ensure that any assumptions about when connections are created in the
643- connection pool are eliminated. The python-oracledb Thin mode creates
621+ 5. To connect using a :ref: `TNS Alias <netservice >` from a ``tnsnames.ora ``
622+ file (see :ref: `optnetfiles `) in python-oracledb Thin mode, you should
623+ explicitly set the environment variable ``TNS_ADMIN `` to the directory
624+ containing the file, or set :attr: `defaults.config_dir `, or set the
625+ ``config_dir `` parameter when connecting.
626+
627+ A ``tnsnames.ora `` file in a "default" location such as the Instant Client
628+ ``network/admin/ `` subdirectory may not be automatically loaded in Thin mode
629+ on some platforms. A ``tnsnames.ora `` file identified by the Windows
630+ registry, or in ``$ORACLE_BASE/homes/XYZ/network/admin/ `` (in a read-only
631+ Oracle Database home) will never be automatically located by python-oracledb
632+ Thin mode.
633+
634+ Only python-oracledb Thick mode will read :ref: `sqlnet.ora <optnetfiles >` and
635+ :ref: `oraaccess.xml <optclientfiles >` files. The Thin mode lets equivalent
636+ properties be set in the application when connecting.
637+
638+ 6. To use python-oracledb Thin mode in an ORACLE_HOME database installation
639+ environment, you must use an explicit connection string since the
640+ ``ORACLE_SID ``, ``TWO_TASK ``, and ``LOCAL `` environment variables are not
641+ used. They are used in Thick mode.
642+
643+ 7. Ensure that any assumptions about when connections are created in the
644+ connection pool are eliminated. Python-oracledb Thin mode creates
644645 connections in a daemon thread and so the attribute
645646 :attr: `ConnectionPool.opened ` will change over time and will not be equal
646647 to :attr: `ConnectionPool.min ` immediately after the pool is created. Note
@@ -651,38 +652,40 @@ addition to the common :ref:`commonupgrade`:
651652 :meth: `ConnectionPool.acquire() ` until sufficient time has passed for
652653 connections in the pool to be created.
653654
654- 7 . Review error handling improvements. See :ref: `errorhandling `.
655+ 8 . Review error handling improvements. See :ref: `errorhandling `.
655656
656- 8. Review locale and globalization usage. See :ref: `globalization `.
657+ 9. Review locale and globalization usage. Python-oracledb Thin mode ignores
658+ all NLS environment variables. It also ignores the ``ORA_TZFILE ``
659+ environment variable. Thick mode does use these variables. See
660+ :ref: `globalization `.
661+
662+ .. _upgradethick :
657663
658664Additional Upgrade Steps to use python-oracledb Thick Mode
659665++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
660666
661667To use python-oracledb Thick mode, the following changes need to be made in
662668addition to the common :ref: `commonupgrade `:
663669
664- 1. The function :func: `oracledb.init_oracle_client() ` *must * be called. It
665- can be called anywhere before the first call to :func: ` ~oracledb.connect() `,
666- `` oracledb.Connection () ``, and ``oracledb.SessionPool () ``. This enables the
667- Thick mode . See :ref: `enablingthick ` for more details.
670+ 1. The function :func: `oracledb.init_oracle_client() ` *must * be called to
671+ enable python-oracle Thick mode. It can be called anywhere before the first
672+ call to :func: ` oracledb.connect () `, ``oracledb.Connection () ``, or
673+ `` oracledb.SessionPool() `` . See :ref: `enablingthick ` for more details.
668674
669- The requirement to call `` init_oracle_client() `` means that Oracle Client
670- library loading is not automatically deferred until the driver is first
671- used, such as when a connection is opened. The application must explicitly
672- manage this if deferral is required.
675+ The requirement to call :func: ` ~oracledb. init_oracle_client() ` means that
676+ Oracle Client library loading is not automatically deferred until the driver
677+ is first used, such as when a connection is opened. The application must
678+ explicitly manage this if deferral is required.
673679
674- In python-oracledb, `` init_oracle_client() `` can be called multiple times in
675- a Python process as long as the arguments are the same.
680+ In python-oracledb, :func: ` ~oracledb. init_oracle_client() ` can be called
681+ multiple times in a Python process as long as the arguments are the same.
676682
677683 Note that on Linux and related operating systems, the
678- `` init_oracle_client() ` ` parameter ``lib_dir `` should not be
684+ :func: ` ~oracledb. init_oracle_client() ` parameter ``lib_dir `` should not be
679685 passed. Instead, set the system library search path with ``ldconfig `` or
680686 ``LD_LIBRARY_PATH `` prior to running Python.
681687
682- 2. Replace all usages of the deprecated Advanced Queuing API with the new API
683- originally introduced in cx_Oracle 7.2, see :ref: `aqusermanual `.
684-
685- 3. Review error handling improvements. See :ref: `errorhandling `.
688+ 2. Review error handling improvements. See :ref: `errorhandling `.
686689
687690Code to Aid the Upgrade to python-oracledb
688691------------------------------------------
@@ -725,7 +728,7 @@ You can then choose what mode is in use by setting the environment variable
725728 export ORA_PYTHON_DRIVER_TYPE=thin
726729 python test.py
727730
728- Output shows the python-oracledb Thin mode was used::
731+ Output shows that python-oracledb Thin mode was used::
729732
730733 python-oracledb thn : 3.0.0
731734
0 commit comments