Каков рекомендуемый способ запроса базы данных с использованием Py MySQL и SQLAlchemy Core внутри приложения flask? - PullRequest
0 голосов
/ 17 апреля 2020

Я объявил глобальный объект соединения и пытаюсь использовать его на нескольких конечных точках. Однако после нескольких запросов я получаю ошибку pymysql.err.InternalError: Packet sequence number wrong. Из того, что я прочитал, похоже, что это связано с безопасностью потоков и тем фактом, что объект SQLAlchemy connection не является потокобезопасным. Должен ли я открывать отдельное соединение каждый раз, когда я выполняю запрос? Или есть какой-то другой шаблон, который я могу использовать? Мне нужно использовать SQLAlchemy Core.

from flask import Flask, jsonify, request
from webargs import fields
from webargs.flaskparser import use_args, use_kwargs, parser, abort
from sqlalchemy import create_engine, MetaData, Table, select, func, and_
from flask_cors import CORS, cross_origin

engine = create_engine('...')

connection = engine.connect()

metadata = MetaData()
metadata.reflect(bind=engine)
vesseldetail = metadata.tables['VESSELDETAIL']
keydate = metadata.tables['KEYDATE']

app = Flask(__name__)

cors = CORS(app, resources={r"/api/*": {"origins": "*"}})

@app.route('/api/list-vessels', methods=['GET'])
def list_vessels():
    vessel_list = []
    s = select([vesseldetail.c.Vessel])
    rp = connection.execute(s)
    for row in rp:
        vessel_list.extend(list(row))
    return jsonify(vessel_list)

@app.route('/api/list-keydates/', methods=['GET'])
def list_keydates():
    vesselname = request.args["vesselname"]
    intervention_list = []
    keydate_list = []
    s = select([keydate.c.Intervention, keydate.c.Date])
    s = s.where(keydate.c.VESSEL==vesselname)
    rp = connection.execute(s)
    for row in rp:
        intervention_list.append(row[0])
        keydate_list.append(row[1])
    return jsonify({"keydates": keydate_list,
                    "intervention": intervention_list})
...