[docs]defensure_session(engine_or_session:Union[Engine,Session])->Tuple[Session,bool]:""" If it is an engine, then create a session from it. And indicate that this session should be closed after the job done. **中文文档** 在 ORM 中对数据进行操作主要是通过 Session. 如果传入的参数是 Engine, 则创建一个 Session, 用完之后是要 close 的, 所以 ``auto_close = True`` 因为这个 Session 反正是新创建的. 如果传入的参数是 Session, 用完之后是否 close 取决于业务, 所以 ``auto_close = False``. """ifisinstance(engine_or_session,Engine):engine_id=id(engine_or_session)ifengine_idnotinsession_klass_cache:# pragma: no coversession_klass_cache[engine_id]=sessionmaker(bind=engine_or_session)SessionClass=session_klass_cache[engine_id]session=SessionClass()auto_close=Truereturnsession,auto_closeelifisinstance(engine_or_session,Session):session=engine_or_sessionauto_close=Falsereturnsession,auto_close
[docs]defclean_session(session:Session,auto_close:bool,):""" Close session if necessary. Just a syntax sugar. """ifauto_close:session.close()
from.pkgimporttimeout_decoratordeftest_connection(engine,timeout=3):@timeout_decorator.timeout(timeout)def_test_connection(engine):v=engine.execute(sa.text("SELECT 1;")).fetchall()[0][0]assertv==1try:_test_connection(engine)returnTrueexcepttimeout_decorator.TimeoutError:raisetimeout_decorator.TimeoutError("time out in %s seconds!"%timeout)exceptAssertionError:# pragma: no coverraiseValueErrorexceptExceptionase:raisee