#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.