id,summary,reporter,owner,description,type,status,component,version,severity,resolution,keywords,cc,stage,has_patch,needs_docs,needs_tests,needs_better_patch,easy,ui_ux 29199,Oracle backend won't connect if password contains '@',Shane Allgeier,Mariusz Felisiak,"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 .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.",Bug,closed,"Database layer (models, ORM)",dev,Normal,fixed,oracle,,Ready for checkin,1,0,0,0,0,0