I had an unpleasant problem connecting to an Oracle schema through SQLAlchemy using the service name. Here is my code as a script. (elements between angle brackets are space holders for real values ββfor safety reasons)
from sqlalchemy import create_engine if __name__ == "__main__": engine = create_engine("oracle+cx_oracle://<username>:<password>@<host>/devdb") result = engine.execute("create table test_table (id NUMBER(6), name VARCHAR2(15) not NULL)") result = engine.execute("drop table test_table")
Where "devdb" is the name of the service, not the SID. The result of running this script is a stack trace.
(oracle-test)[1] jgoodell@jgoodell-MBP :python$ python example.py Traceback (most recent call last): File "example.py", line 8, in <module> result = engine.execute("create table test_table (id NUMBER(6), name VARCHAR2(15) not NULL)") File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1621, in execute connection = self.contextual_connect(close_with_result=True) File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/engine/base.py", line 1669, in contextual_connect self.pool.connect(), File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/pool.py", line 272, in connect return _ConnectionFairy(self).checkout() File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/pool.py", line 425, in __init__ rec = self._connection_record = pool._do_get() File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/pool.py", line 777, in _do_get con = self._create_connection() File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/pool.py", line 225, in _create_connection return _ConnectionRecord(self) File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/pool.py", line 318, in __init__ self.connection = self.__connect() File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/pool.py", line 368, in __connect connection = self.__pool._creator() File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/engine/strategies.py", line 80, in connect return dialect.connect(*cargs, **cparams) File "/Users/jgoodell/.virtualenvs/oracle-test/lib/python2.6/site-packages/sqlalchemy/engine/default.py", line 279, in connect return self.dbapi.connect(*cargs, **cparams) sqlalchemy.exc.DatabaseError: (DatabaseError) ORA-12505: TNS:listener does not currently know of SID given in connect descriptor None None
If "devdb" was the SID and not the service name, this example will work fine, I am trying to use different permutations of the connection string, but I did not find anything that works. There is also nothing in the SQLAlchemy documentation that explicitly explains how to handle SID style service names for Oracle connections.