I was creating an API using Flask and MySQLdb to query data but was advice to use sqlalchemy due to connection pooling. This will be better for my site if high traffic occurred as I do not need to do hard open and close database connection
However, when I transform the working code to sqlalchemy, it does not getting the prefix
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:xxx@zzz.mysql.pythonanywhere-services.com/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})
Result:
{
"Stock": [
[
11,
"PRESTAR",
"PRESTAR RESOURCES BERHAD [S]",
23.8,
],
What I get from previous code with 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})
Result that require and show prefix:
{
"Stock": [
{
"Stock": "PRESTAR",
"Stockcode": "11",
"Change_pc": 2.604,
"Name": "PRESTAR RESOURCES BERHAD [S]",
},
In the code with sqlalchemy, I do not use cursor close and db close, as sqlalchemy engine will handle the connection pooling, is that correct?