3. Initializing python-oracledb — python-oracledb 3.2.0b1 documentation (original) (raw)

By default, python-oracledb runs in a ‘Thin’ mode which connects directly to Oracle Database. This mode does not need Oracle Client libraries. However, some additional functionality is available when python-oracledb uses them. Python-oracledb is said to be in ‘Thick’ mode when Oracle Client libraries are used. Both modes have comprehensive functionality supporting the Python Database API v2.0 Specification.

All connections in an application use the same mode. See Finding the python-oracledb Modeto verify which mode is in use.

If you are upgrading from the obsolete cx_Oracle driver to python-oracledb, then refer to Upgrading from cx_Oracle 8.3 to python-oracledb for changes that may be needed.

3.1. Enabling python-oracledb Thick mode

To change from the default python-oracledb Thin mode to Thick mode:

  1. Oracle Client libraries must be available to handle communication to your database. These need to be installed separately, see Installing python-oracledb.
    Oracle Client libraries from one of the following can be used:

The Client library version does not always have to match the Oracle Database version.

  1. Your application must call the functionoracledb.init_oracle_client() to load the client libraries. For example, if the Oracle Instant Client libraries are inC:\oracle\instantclient_23_5 on Windows or$HOME/Downloads/instantclient_23_3 on macOS, then you can use:
    import os
    import platform
    import oracledb
    d = None # On Linux, no directory should be passed
    if platform.system() == "Darwin": # macOS
    d = os.environ.get("HOME")+("/Downloads/instantclient_23_3")
    elif platform.system() == "Windows": # Windows
    d = r"C:\oracle\instantclient_23_5"
    oracledb.init_oracle_client(lib_dir=d)

The use of a ‘raw’ string r"..." on Windows means that backslashes are treated as directory separators. On Linux, the libraries must be in the system library search path before the Python process starts, preferably configured with ldconfig.

More details and options are shown in the later sections:

Notes on calling init_oracle_client()

3.1.1. Enabling python-oracledb Thick Mode on Windows

On Windows, the alternative ways to enable Thick mode are:

3.1.2. Enabling python-oracledb Thick Mode on macOS

On macOS, the alternative ways to enable Thick mode are:

If python-oracledb does not find the Oracle Client library in that directory, the directories on the system library search path may be used, for example,~/lib/ and /usr/local/lib, or in $DYLD_LIBRARY_PATH. These paths will vary with macOS version and Python version. Any value inDYLD_LIBRARY_PATH will not propagate to a sub-shell, so do not rely on setting it.
If the Oracle Client libraries cannot be loaded, then an exception is raised.

Ensure that the Python process has directory and file access permissions for the Oracle Client libraries.

On Linux and related platforms, enable Thick mode by callinginit_oracle_client() without passing a lib_dirparameter.

import oracledb

oracledb.init_oracle_client()

Oracle Client libraries are looked for in the operating system library search path, such as configured with ldconfig or set in the environment variableLD_LIBRARY_PATH. This must be configured prior to running the Python process. Web servers and other daemons commonly reset environment variables so using ldconfig is generally preferred instead. On some UNIX platforms an OS specific equivalent, such as LIBPATH or SHLIB_PATH, is used instead of LD_LIBRARY_PATH.

If libraries are not found in the system library search path, then libraries in $ORACLE_HOME/lib will be used. Note that the environment variableORACLE_HOME should only ever be set when you have a full database installation or full client installation (such as installed with the Oracle GUI installer). It should not be set if you are using Oracle Instant Client. If being used, ORACLE_HOME and other necessary Oracle environment variables should be set before starting Python. See Oracle Environment Variables for python-oracledb.

If the Oracle Client libraries cannot be loaded, then an exception is raised.

On Linux, python-oracledb Thick mode will not automatically load Oracle Client library files from the directory where the python-oracledb binary module is located. One of the above methods should be used instead.

Ensure that the Python process has directory and file access permissions for the Oracle Client libraries. OS restrictions may prevent the opening of Oracle Client libraries installed in unsafe paths, such as from a user directory. You may need to install the Oracle Client libraries under a directory like /optor /usr/local.

3.1.4. Tracing Oracle Client Library Loading

To trace the loading of Oracle Client libraries, the environment variableDPI_DEBUG_LEVEL can be set to 64 before starting Python. At a Windows command prompt, this could be done with:

On Linux and macOS, you might use:

export DPI_DEBUG_LEVEL=64

When your python-oracledb application is run, logging output is shown on the terminal.

3.2. Explicitly Enabling python-oracledb Thin Mode

Python-oracledb defaults to Thin mode after determining that Thick mode is not going to be used. In one special case, you may wish to explicitly enable Thin mode to prevent Thick mode from being enabled later.

To allow application portability, the driver’s internal logic allows applications to initially attempt standalone connection creation in Thin mode, but then lets them enable Thick mode if that connection is unsuccessful. An example is when trying to connect to an Oracle Database that turns out to be an old version that requires Thick mode. This heuristic means Thin mode is not enforced until the initial connection is successful. Since all connections must be the same mode, any second and subsequent concurrent Thin mode connection attempt will wait for the initial standalone connection to succeed, meaning the driver mode is no longer potentially changeable to Thick mode.

If you have multiple threads concurrently creating standalone Thin mode connections, you may wish to call oracledb.enable_thin_mode() as part of your application initialization. This is not required but avoids the mode determination delay.

The mode determination delay does not affect the following cases, so callingenable_thin_mode() is not needed for them:

The delay also does not affect applications that have already calledoracledb.init_oracle_client() to enable Thick mode.

To explicitly enable Thin mode, call enable_thin_mode(), for example:

import oracledb

oracledb.enable_thin_mode()

Once this method is called, then python-oracledb Thick mode cannot be enabled. If you call oracledb.init_oracle_client(), you will get the following error:

DPY-2019: python-oracledb thick mode cannot be used because thin mode has already been enabled or a thin mode connection has already been created

If you have already enabled Thick mode by callingoracledb.init_oracle_client() and then calloracledb.enable_thin_mode(), you will get the following error:

DPY-2053: python-oracledb thin mode cannot be used because thick mode has already been enabled

3.3. Optional Oracle Configuration Files

3.3.1. Optional Oracle Net Configuration Files

Optional Oracle Net configuration files may be read when connecting or creating connection pools. These files affect connection behavior. The common files are:

See Using Optional Oracle Configuration Files to understand how python-oracledb locates the files.

3.3.2. Optional Oracle Client Configuration File

When python-oracledb Thick mode uses Oracle Client libraries version 12.1 or later, an optional client parameter file called oraaccess.xml can be used to configure some behaviors of those libraries, such as statement caching and prefetching. This can be useful to change application behavior if the application code cannot be altered.

A sample oraaccess.xml file that sets the Oracle client ‘prefetch’ value to 1000 rows for every query in the application is:

1000

The oraaccess.xml file has other uses including:

Refer to the documentation on oraaccess.xmlfor more details.

See Using Optional Oracle Configuration Files to understand how python-oracledb locates the file.

For another way to set some python-oracledb behaviors without changing application code, see Python-oracledb Parameters Settable in Easy Connect Strings or Central Configuration Providers.

3.3.3. Using Optional Oracle Configuration Files

If you use optional Oracle configuration files such as tnsnames.ora,sqlnet.ora, or oraaccess.xml to configure your connections, then put the files in a directory accessible to python-oracledb and follow steps shown below.

Note that the Easy Connect syntax can set many common configuration options without needing tnsnames.ora, sqlnet.ora, ororaaccess.xml files.

Locating tnsnames.ora in python-oracledb Thin mode

Python-oracledb will read a tnsnames.ora file when a TNS Alias is used for the dsn parameter of oracledb.connect(),oracledb.create_pool(), oracledb.connect_async(), ororacledb.create_pool_async(). Only one tnsnames.ora file is read. If the TNS Alias is not found in that file, then connection will fail. Thin mode does not read other configuration files such as sqlnet.ora ororaaccess.xml.

In python-oracledb Thin mode, you should explicitly specify the directory because some traditional “default” locations such as$ORACLE_BASE/homes/XYZ/network/admin/ (in a read-only Oracle Database home) or the Windows registry are not automatically used.

The directory used to locate tnsnames.ora is determined as follows (first one wins):

This order also applies to python-oracledb Thick mode whenoracledb.defaults.thick_mode_dsn_passthrough is False.

Locating tnsnames.ora, sqlnet.ora or oraaccess.xml in python-oracledb Thick mode

In python-oracledb Thick mode, the directory containing the optional Oracle Client configuration files such as tnsnames.ora, sqlnet.ora, andoraaccess.xml can be explicitly specified, otherwise the Oracle Client libraries will use a heuristic to locate the directory.

If oracledb.defaults.thick_mode_dsn_passthrough is False, then the following applies to all files except tnsnames.ora.

The configuration file directory is determined as follows:

On Windows, in a full database install, the Windows registry may be also be consulted by Oracle Client.

For information about the search path see Oracle Net Services Reference for more information.

The documentation Network Configuration has additional information about some specific Oracle Net configuration useful for applications.

Setting thick_mode_dsn_passthrough

When oracledb.defaults.thick_mode_dsn_passthrough is True, it is the Oracle Client libraries that locate and read any optionaltnsnames.ora configuration. This was always the behavior of python-oracledb Thick mode in versions prior to 3.0, and is the default in python-oracledb 3.0 and later.

Setting oracledb.defaults.thick_mode_dsn_passthrough to_False_ makes Thick mode use the same heuristics as Thin mode regarding connection string parameter handling and reading any optional tnsnames.oraconfiguration file.

Files such as sqlnet.ora and oraaccess.xml are only used by Thick mode. They are always located and read by Oracle Client libraries regardless of the oracledb.defaults.thick_mode_dsn_passthrough value. The directory search heuristic is determined by the Oracle Client libraries at the time oracledb.init_oracle_client() is called, as shown above.

The oracledb.defaults.thick_mode_dsn_passthrough value is ignored in Thin mode.

3.4. Oracle Environment Variables for python-oracledb

Some common environment variables that influence python-oracledb are shown below. The variables that may be needed depend on how Python is installed, how you connect to the database, and what optional settings are desired. It is recommended to set Oracle variables in the environment before calling Python. However, they may also be set in the application with os.putenv() before the first connection is established.

Note

System environment variables such as LD_LIBRARY_PATH must be set before Python starts.

The common environment variables listed below are supported in python-oracledb.

Table 3.1 Common Oracle environment variables supported by python-oracledb

Oracle Environment Variable Purpose Python-oracledb Mode
LD_LIBRARY_PATH The library search path for platforms like Linux should include the Oracle libraries, for example $ORACLE_HOME/lib or /opt/instantclient_23_5. This variable is not needed if the libraries are located by an alternative method, such as with ldconfig. On other UNIX platforms, you may need to set an OS specific equivalent such as LIBPATH or SHLIB_PATH. Thick
NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT Often set in Python applications to force a consistent date format independent of the locale. These variables are ignored if the environment variable NLS_LANG is not set. Thick
NLS_LANG Determines the ‘national language support’ globalization options for python-oracledb. Note that from cx_Oracle 8, the character set component is ignored and only the language and territory components of NLS_LANG are used. The character set can instead be specified during connection or connection pool creation. See Character Sets and Globalization. Thick
ORA_SDTZ The default session time zone. Both
ORA_TZFILE The name of the Oracle time zone file to use. See Time Zone Files. Thick
ORACLE_HOME The directory containing the Oracle Database software. The directory and various configuration files must be readable by the Python process. This variable should not be set if you are using Oracle Instant Client. Thick
PATH The library search path for Windows should include the location where OCI.DLL is found. This variable is not needed if you set lib_dir in a call to oracledb.init_oracle_client(). Thick
TNS_ADMIN The directory of optional Oracle Client configuration files such as tnsnames.ora and sqlnet.ora. Generally not needed if the configuration files are in a default location, or if config_dir was not used in oracledb.init_oracle_client(). See Optional Oracle Net Configuration Files. Both

3.5. Other python-oracledb Thick Mode Initialization

The oracledb.init_oracle_client() function allows driver_name anderror_url parameters to be set. These are useful for applications whose end-users are not aware that python-oracledb is being used. An example of setting the parameters is:

oracledb.init_oracle_client(driver_name="My Great App : 3.1.4", error_url="https://example.com/MyInstallInstructions.html")

The convention for driver_name is to separate the product name from the product version by a colon and single blank characters. The value will be shown in Oracle Database views like V$SESSION_CONNECT_INFO. If this parameter is not specified, then the value specified in theoracledb.defaults.driver_name attribute is used. If the value of this attribute is None, then a value likepython-oracledb thk : 3.0.0 is shown, see Finding the python-oracledb Mode.

The error_url string will be shown in the exception raised ifinit_oracle_client() cannot load the Oracle Client libraries. This allows applications that use python-oracledb in Thick mode to refer users to application-specific installation instructions. If this value is not specified, then the Installing python-oracledb URL is used.

3.6. Migrating from python-oracledb Thick Mode to python-oracledb Thin Mode

Changing an application that currently uses Thick modeto use Thin mode requires the removal of calls tooracledb.init_oracle_client() and an application restart. Other small changes may be required:

  1. Remove all calls to oracledb.init_oracle_client() from the application.
  2. Review Appendix A: Oracle Database Features Supported by python-oracledb and Appendix B: Differences between python-oracledb Thin and Thick Modes for code changes that may be needed.
  3. Restart your application.
  4. Test and validate your application behavior.

When you are satisfied, you can optionally remove Oracle Client libraries. For example, delete your Oracle Instant Client directory.

You can validate the python-oracledb mode by checking Connection.thin,ConnectionPool.thin, or by querying the CLIENT_DRIVER column of V$SESSION_CONNECT_INFO and verifying if the value of the column begins with the text python-oracledb thn. See Finding the python-oracledb Mode.

Note all connections in a python-oracledb application must use the same mode.