Операционная ошибка SQLAlchemy в процессе подписки PayPal

#python #postgresql #heroku #psycopg2

Вопрос:

У меня есть приложение, созданное с помощью Flask amp; Plotly Dash — своего рода мэшап, позволяющий подписываться на панель мониторинга через PayPal.

Я не могу воспроизвести ошибку в разработке, но иногда я получаю ошибку в журналах Heroku, когда кто-то регистрируется, но не может пройти процесс подписки PayPal. Один человек упомянул, что загрузка PayPal находится в бесконечном цикле, но в остальном неясно, в чем проблема.

Ошибка в журналах такова, но ссылка мне не помогает:

 output_value = func(*args, **kwargs) # %% callback invoked %% File "/app/index.py", line 347, in successful conn.execute(upd) File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1263, in execute return meth(self, multiparams, params, _EMPTY_EXECUTION_OPTS) File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection return connection._execute_clauseelement( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1452, in _execute_clauseelement ret = self._execute_context( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1814, in _execute_context self._handle_dbapi_exception( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1995, in _handle_dbapi_exception util.raise_( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 207, in raise_ raise exception File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 1771, in _execute_context self.dialect.do_execute( File "/app/.heroku/python/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 717, in do_execute cursor.execute(statement, parameters) sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected  [SQL: UPDATE users SET subscribed=%(subscribed)s WHERE users.id = %(id_1)s] [parameters: {'subscribed': 0, 'id_1': '11'}] (Background on this error at: https://sqlalche.me/e/14/e3q8)  

строка 347 в успешном из index.py ссылается на следующий код. Строка 347-это конн.выполнить в 3-м последнем операторе else в коде.

 @app.callback(  Output('url_login', 'pathname')  , [Input('login-button', 'n_clicks')]  , [State('uname-box', 'value')  , State('pwd-box', 'value')]) def successful(n_clicks, username, password):  conn = psycopg2.connect(  dbname=dbname,  user=dbuser,  password=dbpassword,  host=dbhost,  port=dbport,  sslmode=os.environ['sslmode']  )  c = conn.cursor()  if paypalenv == "Live":  environment = LiveEnvironment(client_id=client_id, client_secret=client_secret)  else:  environment = SandboxEnvironment(client_id=client_id, client_secret=client_secret)  client = PayPalHttpClient(environment)   user = Users.query.filter_by(username=username).first()    if user:  if check_password_hash(user.password, password):  login_user(user)  cuid = current_user.get_id()  c.execute(f"select orderid from users where id = {cuid}")  oid = c.fetchone()  c.execute(f"select status from users where id = {cuid}")  status = c.fetchone()  if oid[0] is not None:  act = SubscriptionActivate(oid[0])  try:  response = client.execute(act)  except:  response = None  if response is not None:  if response.result.status == 'ACTIVE':  upd = update(Users).where(Users.id == cuid).values(subscribed=1, status= 'ACTIVE')  conn = engine.connect()  conn.execute(upd)  conn.close()  else:  upd = update(Users).where(Users.id == cuid).values(subscribed=0)  conn = engine.connect()  conn.execute(upd)  conn.close()  return '/subscribe'  else:  upd = update(Users).where(Users.id == cuid).values(subscribed=0)  conn = engine.connect()  conn.execute(upd)  conn.close()  return '/subscribe'  else:  pass  else:  pass  

Ценю любую помощь, не могу найти никаких ответов на этот вопрос и не знаю, как проверить / воспроизвести проблему!

Комментарии:

1. Это ошибка сокета. Не слишком ли долго выполняется запрос? Это может быть тайм-аут.

2. Почти уверен , что вы хотите conn.commit() , чтобы после каждого оператора DDL и до conn.close() , но я не говорю, что это причина ошибки.

3. @Selcuk Я признаю, что не знаю. Возможно, это тайм-аут, если человек / paypal занимает слишком много времени? Есть идеи, как это исправить?

4. @mechanical_meat я попробую, но точно так же не уверен, что это поможет! после conn.execute(upd) очереди?

5. Да, точно сразу после этой строки. Идея заключается в том, что вы фиксируете это изменение в базе данных. Я не уверен, есть ли параметр автоматической фиксации где-либо в коде подключения SQLAlchemy, так что это может что-то сделать, а может и не сделать.