#29199: Oracle backend won't connect if password contains '@'
-------------------------------------+-------------------------------------
Reporter: Shane Allgeier | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 2.0
(models, ORM) |
Severity: Normal | Resolution:
Keywords: oracle | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Shane Allgeier):
* type: Uncategorized => Bug
Old description:
> 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.
New description:
The Oracle backend won't connect if password contains '@'.
For example, 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#comment:1>
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/071.31fed16ee628637e3980a3bf352b0f27%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.