Почему после рестарта mysql перестает работать flask?

Вот такой тестовый код:
from flask import Flask
import pymysql
app = Flask(__name__)
conn = pymysql.connect(host='localhost',
                       user='xxx',
                       passwd='yyy',
                       db='zzz',
                       charset='utf8')

cur = conn.cursor(pymysql.cursors.DictCursor)


@app.route('/')
def hello_world():
    try:
        cur.execute("select * from news where id=209")
    except Exception as e:
        print(e)
    print(cur.fetchall())
    return "aaa"


if __name__ == '__main__':
        app.run()


Все отлично работает, пока не сделаешь рестарт майсквеля:
/etc/init.d/mysqld restart
Stopping mysqld:                                         [  OK  ]
Starting mysqld:                                           [  OK  ]


И в логах получаю вот такое:
127.0.0.1 - - [28/Jun/2014 12:53:01] "GET / HTTP/1.1" 200 -
(2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))")


Как это победить?
  • Вопрос задан
  • 2993 просмотра
Решения вопроса 1
@pcdesign Автор вопроса
Решил это дело вот так:
from flask import Flask, g 
import pymysql
app = Flask(__name__)


@app.before_request
def before_request():
    g.conn = pymysql.connect(host='localhost',
                             user='pm',
                             passwd='wccme',
                             db='pcm',
                             charset='utf8')

    g.cur = g.conn.cursor(pymysql.cursors.DictCursor)


@app.teardown_request
def close_mysql(exception=None):
    g.conn.close()


@app.route('/')
def hello_world():
    try:
        g.cur.execute("select * from news where id=209")
    except Exception as e:
        print(e)

    print(g.cur.fetchall())
    return "aaa"


if __name__ == '__main__':
    app.run()


Засунул коннект к базе в before_request, а закрытие соединений в teardown_request.
После этого можно как угодно рестартить mysql.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
kivsiak
@kivsiak
software engineer
А что не понятного? Ты запустил приложение оно подключилось к базе. Коннект пропал. Автореконнета не реализовано. Побеждать это не надо. База - это критическая щтука для прилаги. Что если база рестартует 2 минуты? Что пользователю показывать? Проще всего стопать и запускать uwsgi демона при запуске и остановке базы. Например так opensimulator.org/wiki/Autorestart_With_Upstart.

Если же очень хочется то совет выше sqlalchemy - умеент автоматически преподключаться.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы