Connecting to Oracle ADB from Python
Connect to Oracle ATP or ADW from Python¶
I realised that in some of my previous posts I didn't really detail connecting to ATP and ADW. Here's a slight more in depth walkthough.
Connecting to Oracle Autonomous Transaction Processing or Autonomous Datawarehouse is pretty simple from Python. It requires only a few things
- Oracle Instant Client (Or alternative)
- A Python environment.
- The Oracle_CX Python driver Module.
- A valid wallet for an ATP or ADW service
Let's go through each of these in turn
Oracle Instant Clent¶
The next step is pretty straight forward. You can download the oracle instant client from here.
You'll only need the basic package. Unzip the downloaded file into a suitable location. It's worth pointing out that on Linux this step is even easier. You can now use yum to install the instant client direct from the command line. You can find details on how to configure it here
Python environment¶
There's plenty of guides out there that show you how to install python on your windows or mac. If you haven't done this already This guide is a good place to start. I'm assuming that you've also gone through the steps of installing pip
. If not you can follow this simple guide. I'd also advice you create a virtual environment with virtualenv
before you doing anything else. It's considered best practice and isolates you from current or future library conficts.
First lets create our virtual env
virtualenv adb_virt_env
And then active it (I'm assuming linux or mac)
source adb_virt_env/bin/activate
The next step is to install the Python driver. This is as simple as
pip install cx_Oracle
And thats all we need to do at this stage inside to setup our Python environment.
Oracle ADW or ATP Wallet¶
The final thing we need is the wallet containing the credential and connect string details to enable us to connect to ATP or ADW. You'll need to log onto Oracle OCI console to do this unless have been provided the wallet by a colleague. Simply navigate to your ATP or ADW instance and follow the instructions below.
While it's not necessary we'll download and unzip the wallet into the virtual directory we've created (adb_virt_env).
$> ls
bin cx_Oracle-doc include lib pip-selfcheck.json wallet_SBATP.zip
$> unzip wallet_SBATP.zip
Archive: wallet_SBATP.zip
inflating: cwallet.sso
inflating: tnsnames.ora
inflating: truststore.jks
inflating: ojdbc.properties
inflating: sqlnet.ora
inflating: ewallet.p12
inflating: keystore.jks
$> ls
bin cx_Oracle-doc include lib pip-selfcheck.json tnsnames.ora wallet_SBATP.zip
cwallet.sso ewallet.p12 keystore.jks ojdbc.properties sqlnet.ora truststore.jks
Next we need to edit the sqlnet.ora
file to reflect the location where it's located. Currently for my environment it looks like
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
SSL_SERVER_DN_MATCH=yes
We'll need to change the DIRECTORY
parameter to our virtual environment. In my case /Users/dgiles/Downloads/adb_virt_env
. So for my environment it will look like
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/Users/dgiles/Downloads/adb_virt_env")))
SSL_SERVER_DN_MATCH=yes
We should also take a look at tnsnames.ora to see which services we'll be using. You can do this by taking a look in the tnsnames.ora
file. There's likely to by lots of entries if you have lots of ATB or ADW instances in you OCI compartment. In my instance I'll be using a connect string called sbatp_medium
which has a medium priority but pick the one appropriate to your environment.
sbatp_medium = (description= (address=(protocol=tcps)(port=1522)(host=adb.us-phoenix-1.oraclecloud.com))(connect_data=(service_name=gebqwccvhjbqbs_sbatp_medium.atp.oraclecloud.com))(security=(ssl_server_cert_dn=
"CN=adwc.uscom-east-1.oraclecloud.com,OU=Oracle BMCS US,O=Oracle Corporation,L=Redwood City,ST=California,C=US")) )
We'll only need to remember its name for the next step.
The Code¶
Finally we're ready to write some code. The first step is to import the modules we'll need. In this case it's just cx_oracle
and os
import cx_Oracle
import os
We need to set the environment variable TNS_ADMIN
to point at our directory (adb_virt_env) where all of the files from our wallet are located.
os.environ['TNS_ADMIN'] = '/Users/dgiles/Downloads/adb_virt_env'
And now we can simply connect to ATP or ADW instance using a standard Python database connect operation using the connect string we remebered from the tnsnames.ora
file. NOTE : I'm assuming you've created a user in the database or you're using the admin user created for this instance.
connection = cx_Oracle.connect('admin', 'ReallyLongPassw0rd', 'sbatp_medium')
And thats it... From here on in we can use the connection as it was a local database.
cursor = connection.cursor()
rs = cursor.execute("select 'Hello for ADB' from dual")
rs.fetchall()