Qual é a maneira correta de usar SQLAlchemy Sessions with Celery?

Sep 23 2020

Estou tentando descobrir isso há um tempo, mas muitas das respostas que posso encontrar agora estão desatualizadas (postagens de mais de 6 anos atrás) ou menos relacionadas.

A questão é realmente como lidar com as sessões de banco de dados de maneira adequada no aipo. Minha configuração atual é: Eu tenho um objeto DBEngine global que contém dsn, enginee Session. então, toda vez que eu quiser usar uma sessão, eu simplesmente chamo sess = db.Session()e começo a usá-los dentro do meu aplicativo Flask. É parecido com o seguinte:

#db.py
class DbEngine:
  def __init__(self, path, ...):
    self.dsn = self.create_dsn_from_file(path)
    self.engine = create_engine(self.dsn)
    self.Session = scoped_session(sessionmaker(bind=self.engine))

Até eu introduzir o aipo em meu aplicativo, muitas vezes eu recebia vários erros (erro de protocolo, erros de sslSocket, etc). E eu não conseguia reproduzi-los localmente, e muitas vezes é corrigido se eu simplesmente adicionar novas tentativas a essas tarefas (geralmente ocorre com 3 tentativas). Portanto, suspeito que isso pode ser causado pelas sessões compartilhadas.

Então decidi mudar minha sessão para o aplicativo de aipo: toda vez que eu precisar de uma sessão, eu realmente crio um novo mecanismo, crio uma nova Sessão e retornarei o recém-criado Session(). No entanto, o problema semelhante, mas não exatamente o mesmo, aconteceu novamente (vários erros de protocolo com códigos diferentes).

Eu vi que o aipo tem seu próprio SessionManager, mas não consegui encontrar um exemplo de código de uso. Eu estava pensando na seguinte estrutura:

# celery_app.py

celery = ... 

session_manager = SessionManager()
engine, Session = session_manager.create_session(dsn)

e nas tarefas que faço:

# task_1.py
from celery_app import celery, Session

@celery.task
def tsk():
  sess = Session()
  sess.query(...)
  ... 
  sess.close()

Mas realmente não tenho certeza se é a abordagem pretendida, já que estou chamando apenas .create_session()uma vez, e não sei quando e como devo chamar as outras funções no SessionManager.

Para segundo plano, estou usando o DB2.

Se alguém souber como usar adequadamente o SessionManager ou tiver experiência no uso de sessão com SQLAlchemy, ficaria muito grato se você pudesse fornecer algumas dicas. Agradeço antecipadamente!

Respostas

DaveW.Smith Sep 23 2020 at 02:19

Talvez não seja a resposta que você está procurando, mas flask_sqlalchemyfornece uma camada amigável ao Flask sobre o SQLAlchemy que elimina quase inteiramente a necessidade de gerenciar as sessões manualmente. E funciona bem com aipo, uma vez que você configura uma ContextTask de acordo com o exemplo na documentação do Flask .