oracle / python-oracledb

Python driver for Oracle Database conforming to the Python DB API 2.0 specification. This is the renamed, new major release of cx_Oracle
https://oracle.github.io/python-oracledb
Other
307 stars 59 forks source link

Cannot connect to DB by passing kwargs to oracledb.connect() #282

Closed DeltaMichael closed 2 months ago

DeltaMichael commented 5 months ago
  1. What versions are you using?
database version: 19c Free Autonomous Database
platform.platform: macOS-13.6.2-arm64-arm-64bit
sys.maxsize > 2**32: True
platform.python_version: 3.11.7
oracledb.__version__: 2.0.1
  1. Is it an error or a hang or a crash?

Cannot connect to database when I pass host, port, etc. to the connect() function as separate kwargs

  1. What error(s) or behavior you are seeing?
Traceback (most recent call last):
  File "src/oracledb/impl/thin/transport.pyx", line 300, in oracledb.thin_impl.Transport.read_packet
ConnectionResetError: [Errno 54] Connection reset by peer

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

Traceback (most recent call last):
  File "src/oracledb/impl/thin/connection.pyx", line 353, in oracledb.thin_impl.ThinConnImpl._connect_with_address
  File "src/oracledb/impl/thin/protocol.pyx", line 207, in oracledb.thin_impl.Protocol._connect_phase_one
  File "src/oracledb/impl/thin/protocol.pyx", line 386, in oracledb.thin_impl.Protocol._process_message
  File "src/oracledb/impl/thin/protocol.pyx", line 364, in oracledb.thin_impl.Protocol._process_message
  File "src/oracledb/impl/thin/protocol.pyx", line 436, in oracledb.thin_impl.Protocol._receive_packet
  File "src/oracledb/impl/thin/packet.pyx", line 588, in oracledb.thin_impl.ReadBuffer.wait_for_packets_sync
  File "src/oracledb/impl/thin/transport.pyx", line 302, in oracledb.thin_impl.Transport.read_packet
  File "/Users/mdilyan/Projects/vdk-oracle-test/supercollidervdk/lib/python3.11/site-packages/oracledb/errors.py", line 162, in _raise_err
    raise exc_type(_Error(message)) from cause
oracledb.exceptions.DatabaseError: DPY-4011: the database or network closed the connection
[Errno 54] Connection reset by peer
Help: https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpy-4011

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

Traceback (most recent call last):
  File "/Users/mdilyan/Projects/docker-xzibit/example_oracle.py", line 12, in <module>
    connect(user="ADMIN", password="Gr0mH3llscr3am", host="adb.eu-frankfurt-1.oraclecloud.com", port=1522,service_name="ge975b87ba26804_anotherdb_high.adb.oraclecloud.com")
  File "/Users/mdilyan/Projects/vdk-oracle-test/supercollidervdk/lib/python3.11/site-packages/oracledb/connection.py", line 1134, in connect
    return conn_class(dsn=dsn, pool=pool, params=params, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/mdilyan/Projects/vdk-oracle-test/supercollidervdk/lib/python3.11/site-packages/oracledb/connection.py", line 523, in __init__
    impl.connect(params_impl)
  File "src/oracledb/impl/thin/connection.pyx", line 449, in oracledb.thin_impl.ThinConnImpl.connect
  File "src/oracledb/impl/thin/connection.pyx", line 445, in oracledb.thin_impl.ThinConnImpl.connect
  File "src/oracledb/impl/thin/connection.pyx", line 411, in oracledb.thin_impl.ThinConnImpl._connect_with_params
  File "src/oracledb/impl/thin/connection.pyx", line 392, in oracledb.thin_impl.ThinConnImpl._connect_with_description
  File "src/oracledb/impl/thin/connection.pyx", line 358, in oracledb.thin_impl.ThinConnImpl._connect_with_address
  File "/Users/mdilyan/Projects/vdk-oracle-test/supercollidervdk/lib/python3.11/site-packages/oracledb/errors.py", line 162, in _raise_err
    raise exc_type(_Error(message)) from cause
oracledb.exceptions.OperationalError: DPY-6005: cannot connect to database (CONNECTION_ID=ohatDJOgPqC7iWAtDnzjpA==).
DPY-4011: the database or network closed the connection
[Errno 54] Connection reset by peer
Help: https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpy-4011
  1. Does your application call init_oracle_client()?

No

  1. Include a runnable Python script that shows the problem.

# works fine

from oracledb import ConnectParams, connect

# Works

params = ConnectParams()
params.set(user="ADMIN")
params.set(password="mypass")
params.parse_connect_string("(description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.eu-frankfurt-1.oraclecloud.com))(connect_data=(service_name=ge975b87ba26804_anotherdb_high.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))")
connect(params=params)

# Does not work

connect(user="ADMIN", password="mypass", host="adb.eu-frankfurt-1.oraclecloud.com", port=1522, service_name="ge975b87ba26804_anotherdb_high.adb.oraclecloud.com")
DeltaMichael commented 5 months ago

Note: I also tried this in my CI on alpine linux with an oracle docker container running on localhost. I get the same issue. Passing localhost:1521/FREE works, but passing it as separate parameters does not.

anthony-tuininga commented 5 months ago

The two examples you show are not the same! In the first one you have additional parameters (four of them). The one that matters, however, is the protocol parameter. Using protocol tcp (the default) with a cloud database that expects tcps will result in the server rejecting the connection!

amitdumka commented 4 months ago

I am facing same error The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.496.0_x64qbz5n2kfra8p0\Lib\threading.py", line 1073, in _bootstrap_inner self.run() File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.12_3.12.496.0_x64qbz5n2kfra8p0\Lib\threading.py", line 1010, in run self._target(*self._args, self._kwargs) File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\utils\autoreload.py", line 64, in wrapper fn(*args, *kwargs) File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\core\management\commands\runserver.py", line 136, in inner_run self.check_migrations() File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\core\management\base.py", line 574, in check_migrations executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\migrations\executor.py", line 18, in init
self.loader = MigrationLoader(self.connection) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\migrations\loader.py", line 58, in init
self.build_graph() File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\migrations\loader.py", line 235, in build_graph
self.applied_migrations = recorder.applied_migrations() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\migrations\recorder.py", line 89, in applied_migrations if self.has_table(): ^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\migrations\recorder.py", line 63, in has_table
with self.connection.cursor() as cursor: ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\utils\asyncio.py", line 26, in inner return func(
args,
kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\backends\base\base.py", line 316, in cursor
return self._cursor() ^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\backends\base\base.py", line 292, in _cursor
self.ensure_connection() File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\backends\base\base.py", line 274, in ensure_connection with self.wrap_database_errors: File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\utils.py", line 91, in exit raise dj_exc_value.with_traceback(traceback) from exc_value File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\backends\base\base.py", line 275, in ensure_connection self.connect() File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, *kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\backends\base\base.py", line 256, in connect
self.connection = self.get_new_connection(conn_params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\utils\asyncio.py", line 26, in inner return func(
args,
kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\django\db\backends\oracle\base.py", line 251, in get_new_connection return Database.connect( ^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\oracledb\connection.py", line 1134, in connect return conn_class(dsn=dsn, pool=pool, params=params, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\oracledb\connection.py", line 523, in init impl.connect(params_impl) File "src\oracledb\impl/thin/connection.pyx", line 449, in oracledb.thin_impl.ThinConnImpl.connect File "src\oracledb\impl/thin/connection.pyx", line 445, in oracledb.thin_impl.ThinConnImpl.connect File "src\oracledb\impl/thin/connection.pyx", line 411, in oracledb.thin_impl.ThinConnImpl._connect_with_params File "src\oracledb\impl/thin/connection.pyx", line 392, in oracledb.thin_impl.ThinConnImpl._connect_with_description File "src\oracledb\impl/thin/connection.pyx", line 358, in oracledb.thin_impl.ThinConnImpl._connect_with_address File "C:\Users\amitn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\oracledb\errors.py", line 162, in _raise_err raise exc_type(_Error(message)) from cause django.db.utils.OperationalError: DPY-6005: cannot connect to database (CONNECTION_ID=vy3/RIJitGRILqYZSjVpiQ==). DPY-4011: the database or network closed the connection [WinError 10054] An existing connection was forcibly closed by the remote host Help: https://python-oracledb.readthedocs.io/en/latest/user_guide/troubleshooting.html#dpy-4011

i am using Oracle Cloud Database,

Settings i had made are DATABASES = { 'default': { 'ENGINE': 'django.db.backends.oracle', 'NAME': 'db001_high', 'USER': 'database_user', 'PASSWORD': 'passoword_to_connect', 'HOST': '', 'PORT': '1521', 'TNS_ADMIN':r'D:\DevArea\Wallet_db001', #autocomplete ai added 'Wallet_Passowrd':'Wallet_Password', #autocomplete ai added 'Wallet_Location':r"D:\DevArea\Wallet_db001" # autocomplete ai added }

apart from this. I had set ORACLE_HOME= instantclient address and TNS_ADMIN = wallet_db01 but nothing work.

search in google , one place they ask to NNE enable, after running i found it NNE enabled. Kindly suggest where i am making error or missing anything else.

Thank you

anthony-tuininga commented 4 months ago

@amitdumka, your error is due to the fact that NNE is enabled and thin mode doesn't support it. You will have to enable thick mode to connect.

amitdumka commented 4 months ago

thanks for reply, I tried to enable thick mode , I got error of django.db.utils.DatabaseError: ORA-12547: TNS:lost contact

i called oracledb.init_oracle_client(lib_dir=r("c:\oracle\instantclient_21_13") even set ORACLE_HOME=c:\oracle\instantclient_21_13 even tried change location of method path also. but error is same. i can run python code directly like oracledb.init_oracle_client(lib_dir=r("c:\oracle\instantclient_21_13") oracle.connect(parms) i can fetch tables data. but not in django

anthony-tuininga commented 4 months ago

That error (ORA-12547: TNS:lost contact) is likely due to the fact that you attempted to connect to a server that requires the TCPS protocol using the default TCP protocol. How did you populate your parms variable?

cjbj commented 2 months ago

Closing - no activity.