Hello Simon, Thank you for prompt response. I really appreciate your help. I am trying to achieve password rotation and we are using secret client to fetch new password. I tried do_connect event and fetch new password from secret client, working as expected but we are facing performance issue as we are every time connecting to secret client(3~5sec for each request). Instead I am trying to achieve if connect fails then fetch from secret client.
I tried with handle_error event, when i get error check for invalid user/pwd and update session with latest engine. This approach also did not help Any insights are highly appreciated. Please suggest best approach. Regards, Pydi On Monday, March 21, 2022 at 2:22:04 AM UTC-7 Simon King wrote: > I don't really understand what's going on in your code, but you seem > to be calling engine.connect() inside your "do_connect" event handler. > I would expect that to trigger another "do_connect" event, which in > turn will call engine.connect() again, which will trigger another > "do_connect" event, and so on. I'm surprised the application gets as > far as it does. Maybe the exception handler inside receive_do_connect > is allowing it to stumble on. > > Simon > > On Mon, Mar 21, 2022 at 4:51 AM Srinu Chp <[email protected]> wrote: > > > > Hello Team, > > > > I tried to create a standalone application POC for sqlalchemy to db > connection. When I registered do_connect event, I see event is triggered > couple of times for one call: > > sqlalchemy_connection.py > > > > import os > > import cx_Oracle > > from sqlalchemy import create_engine > > from sqlalchemy import event > > > > cx_Oracle.init_oracle_client(lib_dir=os.environ.get("HOME") + > "/Downloads/instantclient_19_8") > > SQLALCHEMY_CONN = "test" > > count = 0 > > engine = None > > def connect_db(pwd): > > global count > > global engine > > print(SQLALCHEMY_CONN) > > username = "ADMIN" > > password = pwd > > dsn = "pydidb_high" > > engine = create_engine( > > f'oracle://{username}:{password}@{dsn}/?encoding=UTF-8&nencoding=UTF-8', > max_identifier_length=128) > > setup_event_handlers(engine) > > > > def setup_event_handlers(engine): > > @event.listens_for(engine, 'do_connect') > > def receive_do_connect(dialect, conn_rec, cargs, cparams): > > print("inside do_connect") > > global count > > try: > > with engine.connect() as conn: > > print("inside do_connect try block") > > print(conn.scalar("select sysdate from dual")) > > count += 2 > > except Exception as e: > > print("inside do_connect except block") > > count += 1 > > > > def db_connect_test(): > > print(engine) > > with engine.connect() as conn: > > print(conn.scalar("select sysdate from dual")) > > > > gevent_sync.py > > > > import gevent > > import random > > import sqlalchemy_connection > > > > def task(pid): > > gevent.sleep(random.randint(0,2)*0.001) > > print('Task %s done' % pid) > > sqlalchemy_connection.connect_db(**********) > > sqlalchemy_connection.db_connect_test() > > > > def synchronous(): > > for i in range(1,2): > > task(i) > > # sqlalchemy_connection.connect_db(**********) > > > > def asynchronous(): > > threads = [gevent.spawn(task, i) for i in range(2)] > > gevent.joinall(threads) > > > > print('Synchronous:') > > synchronous() > > print('count %s ' % sqlalchemy_connection.count) > > > > # print('Asynchronous:') > > # asynchronous() > > # print('count %s' % sqlalchemy_connection.count) > > > > Output: > > > > Synchronous: > > Task 1 done > > test > > Engine(oracle://ADMIN:***@pydidb_high/?encoding=UTF-8&nencoding=UTF-8) > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect > > inside do_connect except block > > inside do_connect try block > > 2022-03-21 04:39:47 > > inside do_connect try block > > 2022-03-21 04:39:49 > > inside do_connect try block > > 2022-03-21 04:39:51 > > inside do_connect try block > > 2022-03-21 04:39:54 > > inside do_connect try block > > 2022-03-21 04:39:56 > > inside do_connect try block > > 2022-03-21 04:39:59 > > inside do_connect try block > > 2022-03-21 04:40:01 > > inside do_connect try block > > 2022-03-21 04:40:04 > > inside do_connect try block > > 2022-03-21 04:40:09 > > inside do_connect try block > > 2022-03-21 04:40:15 > > inside do_connect try block > > 2022-03-21 04:40:17 > > inside do_connect try block > > 2022-03-21 04:40:19 > > inside do_connect try block > > 2022-03-21 04:40:21 > > inside do_connect try block > > 2022-03-21 04:40:24 > > 2022-03-21 04:40:26 > > count 29 > > > > highly appreciate any inputs. > > Regards, > > Pydi > > > > -- > > SQLAlchemy - > > The Python SQL Toolkit and Object Relational Mapper > > > > http://www.sqlalchemy.org/ > > > > To post example code, please provide an MCVE: Minimal, Complete, and > Verifiable Example. See http://stackoverflow.com/help/mcve for a full > description. > > --- > > You received this message because you are subscribed to the Google > Groups "sqlalchemy" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/08096636-06c4-478f-a54d-0bc8f71db414n%40googlegroups.com > . > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/a0d30530-fc23-4e70-8965-a7b10c17a65cn%40googlegroups.com.
