Поддержание соединения MySQL с peewee в веб-приложении Flask

У меня есть простое веб-приложение Flask, которое использует peewee для управления соединением с MySQL. К сожалению, кажется, я пропустил что-то важное в своем коде, поэтому я получаю ошибку pymysql.err.OperationalError: (2006, "MySQL server has gone away.. после 10-20 минут использования сайта. Если я перезапускаю приложение, оно снова работает нормально, поэтому я предполагаю, что неправильно обрабатываю соединение/соединения.

У меня есть несколько основных запросов, которые я использую для отображения списков в своем пользовательском интерфейсе. Поскольку я новичок в Python, возможно, вся моя логика неверна, поэтому я был бы очень рад, если бы кто-нибудь мог мне объяснить, как правильно управлять запросами (соединение-закрытие соединения) с peewee в моем случае (простой веб-сайт без любые пользовательские функции).

Вы можете увидеть в приведенном ниже коде, как я это делаю сейчас. Все нормально, пока я не подключусь, но после того, как я подключился к БД, я просто вызываю запросы, не связываясь с соединением. Я предполагаю, что должен закрыть соединение на основе вызванного запроса, но не смог найти правильный способ. Вызова myDB.close() недостаточно, или я использую его неправильно.

# this is how I connect to the MySQL
import peewee as pw
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash

myDB = pw.MySQLDatabase("", host="", user="", passwd="")

class MySQLModel(pw.Model):
    """A base model that will use our MySQL database"""
    class Meta:
        database = myDB

class city(MySQLModel):

    ...

class building(MySQLModel):
    ...
myDB.connect()

# this is how I manage the homepage
cityList = []
cityList = city.select().order_by(city.objectId).limit(15)
buildings = []
buildings = building.select().order_by(building.buildingName).limit(180)

def getSearchResult (content_from_url):
    searchResultList = []
    searchResultList = city.select().where(city.objTitle.contains(content_from_url))
    return searchResultList

@app.route('/', methods=['GET', 'POST'])
def main_page():

    search = request.args.get('search')
    if search:
        return render_template("results.html",  search = getSearchResult(search), str = search)
    else:
        return render_template("home.html", name=cityList, buildList=buildings)

# and this is how the subpage
relatedCityList = []
slugObj = []

buildings2 = []
buildings2 = building.select().order_by(building.buildingName).limit(180)

def getLink (title_for_link):
    slugObj = city.get(city.urlSlug == title_for_link)
    return slugObj

def displayRelatedCity (city_to_filter):

    resultCity = city.get(city.urlSlug == city_to_filter)
    relatedCityList = city.select().where(city.objTitle == resultCity.objTitle).limit(20)
    return relatedCityList    

@app.route('/city-list/<content>', methods=['GET', 'POST'])
def city_page(content):

    linkText = getLink(content)

    return render_template("details.html", relatedCity = displayRelatedCity(content), buildingName = linkText.buildingName, buildz = buildings2)

myDB.close()

person rihe    schedule 06.12.2015    source источник


Ответы (1)


Вам нужно переподключаться по запросу/ответу. http://docs.peewee-orm.com/en/latest/peewee/database.html#adding-request-hooks

Есть даже раздел о Flask.

person coleifer    schedule 07.12.2015
comment
Очень приятно получить ответ прямо из источника. Я добавил и все в порядке! - person rihe; 10.12.2015