Flask:使用sqlalchemy选择时缺少前缀

时间:2017-01-10 14:48:03

标签: python sqlalchemy flask-sqlalchemy

我使用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引擎将处理连接池,这是正确的吗?

1 个答案:

答案 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

我不喜欢'认为这与连接池有关。