我使用Flask和MySQLdb创建API来查询数据,但由于连接池,建议使用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: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})
结果:
{
"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引擎将处理连接池,这是正确的吗?
答案 0 :(得分:0)
我认为问题是由jsonify({'Stock': h})
序列化的游标对象对于SQLAlchemy和MySQLdb游标是不同的。
所有数据都是still there并且可以通过多种方式访问,因此您只需要从SQLAlchemy游标中构建一个字典,然后对其进行jsonify。
所以像this这样的东西应该有用(参见其他例子的链接):
def row2dict(row):
d = {}
for column in row.__table__.columns:
d[column.name] = str(getattr(row, column.name))
return d
我不喜欢'认为这与连接池有关。