У меня есть простое веб-приложение 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()