Oracle connection string with at sign @ in pasword
Question:
I have a code that connect to oracle using connection string:
conn = cx_Oracle.connect('username/password@server:port/services')
But the problem is my password contain @ character so it may become
conn = cx_Oracle.connect('username/p@ssword@server:port/services')
it return
DatabaseError: ORA-12154: TNS:could not resolve the connect identifier
specified
I use Django with Oracle with this settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'Services',
'USER': 'user',
'PASSWORD': 'p@ssword',
'HOST': 'ip',
'PORT': 'port',
}
}
I cant change password 🙁 Does anyone know this problem?
Answers:
I haven’t tried cx_Oracle, but you might be able to connect by specifying the individual parameters –
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn='server:port/services')
OR
dsn_tns = cx_Oracle.makedsn('server', 'port', 'services')
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn=dsn_tns)
Does this work?
conn = cx_Oracle.connect('username/"p@ssword"@server:port/services')
You can use any of the following way based on Service Name
or SID
whatever you have.
With SID:
dsn_tns = cx_Oracle.makedsn('server', 'port', 'sid')
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn=dsn_tns)
OR
With Service Name:
dsn_tns = cx_Oracle.makedsn('server', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn=dsn_tns)
FYI: This was a long-standing bug in Django. The first stable version containing the fix is v2.1
All the answers mentioned here did not work for SQLAlchemy.
Parsing the characters to create a valid URL worked:
from sqlalchemy.engine import create_engine
import urllib.parse
url_password = urllib.parse.quote_plus(password)
connection_string = f"oracle+cx_oracle://{username}:{url_password}@{server}:{port}/?service_name={service}"
connection = create_engine(connection_string)
Should probably do the same with the other components of the connection string.
I have a code that connect to oracle using connection string:
conn = cx_Oracle.connect('username/password@server:port/services')
But the problem is my password contain @ character so it may become
conn = cx_Oracle.connect('username/p@ssword@server:port/services')
it return
DatabaseError: ORA-12154: TNS:could not resolve the connect identifier
specified
I use Django with Oracle with this settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'Services',
'USER': 'user',
'PASSWORD': 'p@ssword',
'HOST': 'ip',
'PORT': 'port',
}
}
I cant change password 🙁 Does anyone know this problem?
I haven’t tried cx_Oracle, but you might be able to connect by specifying the individual parameters –
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn='server:port/services')
OR
dsn_tns = cx_Oracle.makedsn('server', 'port', 'services')
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn=dsn_tns)
Does this work?
conn = cx_Oracle.connect('username/"p@ssword"@server:port/services')
You can use any of the following way based on Service Name
or SID
whatever you have.
With SID:
dsn_tns = cx_Oracle.makedsn('server', 'port', 'sid')
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn=dsn_tns)
OR
With Service Name:
dsn_tns = cx_Oracle.makedsn('server', 'port', service_name='service_name')
conn = cx_Oracle.connect(user='username', password='p@ssword', dsn=dsn_tns)
FYI: This was a long-standing bug in Django. The first stable version containing the fix is v2.1
All the answers mentioned here did not work for SQLAlchemy.
Parsing the characters to create a valid URL worked:
from sqlalchemy.engine import create_engine
import urllib.parse
url_password = urllib.parse.quote_plus(password)
connection_string = f"oracle+cx_oracle://{username}:{url_password}@{server}:{port}/?service_name={service}"
connection = create_engine(connection_string)
Should probably do the same with the other components of the connection string.