Я создавал API, используя Flask и MySQLdb для запроса данных, но мне посоветовали использовать sqlalchemy из-за пула соединений. Это будет лучше для моего сайта, если возникнет высокий трафик, так как мне не нужно жестко открывать и закрывать соединение с базой данных.
Однако, когда я преобразовываю рабочий код в sqlalchemy, он не получает префикс
from flask import Flask,jsonify,abort,make_response,request,render_template
from flask.ext.sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
@app.route('/KLSE/search', methods=['GET'])
def KLSEsearch():
engine = create_engine('mysql+mysqldb://xxx:[email protected]/zzz$default')
conn = engine.raw_connection()
cur = conn.cursor()
name = request.args.get('name',default='',type=str)
volumeMin = request.args.get('volumeMin',default=0,type=float)
volumeMax = request.args.get('volumeMax',default=0,type=float)
query = """ SELECT * FROM KLSE WHERE (Stock LIKE %s or Name LIKE %s or Stockcode LIKE %s)
AND (Volume_changes_pc BETWEEN (IF (%s='_',-5000,%s)) AND (IF(%s='_',5000,%s))) """
input = (name+"%",name+"%",name+"%",volumeMin,volumeMin,volumeMax,volumeMax)
try:
cur.execute(query,(input))
h = cur.fetchall()
except Exception:
return 'Error: unable to fetch items'
return jsonify({'Stock': h})
Результат:
{
"Stock": [
[
11,
"PRESTAR",
"PRESTAR RESOURCES BERHAD [S]",
23.8,
],
Что я получаю из предыдущего кода с MySQLdb:
from flask import Flask,jsonify,abort,make_response,request,render_template
import MySQLdb
import MySQLdb.cursors
@app.route('/KLSE/search', methods=['GET'])
def KLSEsearch():
db = MySQLdb.connect(host='xxx.mysql.pythonanywhere-services.com',user='zzz',passwd='xxx',db='zzz$default',cursorclass=MySQLdb.cursors.DictCursor)
curs = db.cursor()
name = request.args.get('name',default='',type=str)
volumeMin = request.args.get('volumeMin',default=0,type=float)
volumeMax = request.args.get('volumeMax',default=0,type=float)
query = """ SELECT * FROM KLSE WHERE (Stock LIKE %s or Name LIKE %s or Stockcode LIKE %s)
AND (Volume_changes_pc BETWEEN (IF (%s='_',-5000,%s)) AND (IF(%s='_',5000,%s))) """
input = (name+"%",name+"%",name+"%",volumeMin,volumeMin,volumeMax,volumeMax)
try:
curs.execute(query,(input))
h = curs.fetchall()
except Exception:
return 'Error: unable to fetch items'
finally:
curs.close()
db.close()
return jsonify({'Stock': h})
Результат, который требует и показывает префикс:
{
"Stock": [
{
"Stock": "PRESTAR",
"Stockcode": "11",
"Change_pc": 2.604,
"Name": "PRESTAR RESOURCES BERHAD [S]",
},
В коде с sqlalchemy я не использую закрытия курсора и закрытия базы данных, так как механизм sqlalchemy будет обрабатывать пул соединений, это правильно?