#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
               Reporter:  Shane      |          Owner:  nobody
  Allgeier                           |
                   Type:             |         Status:  new
  Uncategorized                      |
              Component:  Database   |        Version:  2.0
  layer (models, ORM)                |
               Severity:  Normal     |       Keywords:  oracle
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 Using this DATABASES config in settings.py:
 {{{
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.oracle',
         'NAME': 'mydsn',
         'USER': 'valid_username',
         'PASSWORD': 'p@ssword',
         'HOST': '',
         'PORT': '',
     }
 }
 }}}

 I get this traceback:
 {{{
 Unhandled exception in thread started by <function
 check_errors.<locals>.wrapper at 0x7fab58f99ae8>
 Traceback (most recent call last):
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/base/base.py", line 216, in ensure_connection
     self.connect()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/base/base.py", line 194, in connect
     self.connection = self.get_new_connection(conn_params)
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/oracle/base.py", line 208, in
 get_new_connection
     return Database.connect(self._connect_string(), **conn_params)
 cx_Oracle.DatabaseError: ORA-12154: TNS:could not resolve the connect
 identifier specified

 The above exception was the direct cause of the following exception:

 Traceback (most recent call last):
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/utils/autoreload.py", line 225, in wrapper
     fn(*args, **kwargs)
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/core/management/commands/runserver.py", line 123, in
 inner_run
     self.check_migrations()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/core/management/base.py", line 427, in check_migrations
     executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/migrations/executor.py", line 18, in __init__
     self.loader = MigrationLoader(self.connection)
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/migrations/loader.py", line 49, in __init__
     self.build_graph()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/migrations/loader.py", line 206, in build_graph
     self.applied_migrations = recorder.applied_migrations()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/migrations/recorder.py", line 61, in applied_migrations
     if self.has_table():
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/migrations/recorder.py", line 44, in has_table
     return self.Migration._meta.db_table in
 self.connection.introspection.table_names(self.connection.cursor())
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/base/base.py", line 255, in cursor
     return self._cursor()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/base/base.py", line 232, in _cursor
     self.ensure_connection()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/base/base.py", line 216, in ensure_connection
     self.connect()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/utils.py", line 89, in __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/base/base.py", line 216, in ensure_connection
     self.connect()
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/base/base.py", line 194, in connect
     self.connection = self.get_new_connection(conn_params)
   File "/home/shane/.virtualenvs/django-rms/lib/python3.6/site-
 packages/django/db/backends/oracle/base.py", line 208, in
 get_new_connection
     return Database.connect(self._connect_string(), **conn_params)
 django.db.utils.DatabaseError: ORA-12154: TNS:could not resolve the
 connect identifier specified
 }}}

 After delving into the Oracle backend, I realized that Django is calling
 the cx_Oracle.connect() function like so:
 (django/db/backends/oracle/base.py line 208)
 {{{
 Database.connect('valid_username/p@ssword@mydsn')
 }}}
 You can probably guess why cx_Oracle doesn't like this. As far as I can
 tell, there's no possible way to work around this bug without directly
 editing Django's (or cx_Oracle's) code.
 The following connection method works just fine:
 {{{
 Database.connect('valid_username', 'p@ssword', 'mydsn')
 }}}

 I should also mention that there have been
 [https://stackoverflow.com/q/25767485 others] that have this issue. In my
 case, the bureaucracy at my company won't allow me to choose my own
 password, so fixing Django is my only option.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29199>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/056.dda372c1575db12c375823eedb6ef5f3%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to