From: John Vandenberg Date: Thu, 5 May 2016 13:26:00 +0000 (-0400) Subject: Fix TypeError during cx_Oracle connection X-Git-Tag: rel_1_1_0b1~43^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9611ba3a9d7cb134869d3b17949a33647bd56045;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Fix TypeError during cx_Oracle connection cx_Oracle connection parameters user, password and dsn must be either a string or NULL. When they are passed a Python None object, "TypeError: expecting string, unicode or buffer object" is raised. Fixes: #3705 Change-Id: I8da5d8a227ca12c9bf17a6127460e413841951fb Pull-request: https://github.com/zzzeek/sqlalchemy/pull/271 --- diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 30f8fb73e0..972e808dfa 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -52,6 +52,17 @@ :meth:`.Query.group_by` method would raise an error, instead of intepreting the object as a SQL fragment. + .. change:: + :tags: bug, oracle + :tickets: 3705 + + Fixed a bug in the cx_Oracle connect process that caused a TypeError + when the either the user, password or dsn was empty. This prevented + external authentication to Oracle databases, and prevented connecting + to the default dsn. The connect string oracle:// now logs into the + default dsn using the Operating System username, equivalent to + connecting using '/' with sqlplus. + .. change:: :tags: bug, oracle :tickets: 3699 diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index 0c93ced97d..cfd942d853 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -914,13 +914,17 @@ class OracleDialect_cx_oracle(OracleDialect): dsn = url.host opts = dict( - user=url.username, - password=url.password, - dsn=dsn, threaded=self.threaded, twophase=self.allow_twophase, ) + if dsn is not None: + opts['dsn'] = dsn + if url.password is not None: + opts['password'] = url.password + if url.username is not None: + opts['user'] = url.username + if util.py2k: if self._cx_oracle_with_unicode: for k, v in opts.items():