почему PyMySQL закрывается так рано при использовании contextmanager и sqlalchemy? - PullRequest
0 голосов
/ 11 марта 2019

Я использовал Python 3 contextmanager для управления закрытием MySQL-соединения (), для простоты я написал простой пример:

from sqlalchemy import create_engine
from contextlib import contextmanager

@contextmanager
def db_connect():
   DSNs= {'mysql': 'mysql+pymysql://***?charset=utf8'}

   try:
      engine = create_engine(DSNs['mysql'], pool_recycle=1)
   except ImportError:
      raise RuntimeError()

   conn = engine.connect()
   try:
      yield conn
   finally:
      if conn:
        print(threading.currentThread().getName() + " why closed")
        conn.close() 

if __name__ == '__main__':
     with db_connect() as conn:
        for i in range(0, 100):
           sql = """select {0}""".format(i)
           with conn as cur:
              cur.execute(sql)

Я обнаружил, что могу успешно выполнить запрос один раз, когда я запускаю запрос еще раз, у меня появляется ошибка "соединение уже закрыто"

Traceback (most recent call last): ... in _execute_context
conn = self._revalidate_connection()
base.py", line 469, in _revalidate_connection
raise exc.ResourceClosedError("This Connection is closed")
sqlalchemy.exc.ResourceClosedError: This Connection is closed

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