Flask: отсутствует префикс при выборе с помощью sqlalchemy

Я создавал 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 будет обрабатывать пул соединений, это правильно?


person vindex    schedule 10.01.2017    source источник


Ответы (1)


Я думаю, проблема в том, что объект курсора, сериализуемый jsonify({'Stock': h}), отличается для курсоров SQLAlchemy и MySQLdb.

Все данные все еще там и могут можно получить несколькими способами, поэтому вам просто нужно создать словарь из курсора SQLAlchemy, а затем выполнить его jsonify.

Так что что-то вроде это должно работать (см. ссылку для других примеров):

def row2dict(row):
    d = {}
    for column in row.__table__.columns:
        d[column.name] = str(getattr(row, column.name))
    return d

Я не думаю, что это имеет какое-либо отношение к пулу соединений.

person ACV    schedule 10.01.2017
comment
Я использую ядро ​​​​sqlalchemy, потому что оно может обрабатывать пул соединений. однако мой код хорош для большого трафика или все же предпочтительнее sqlalchemy ORM? - person vindex; 11.01.2017
comment
Итак, вы задаете два разных вопроса, первый из которых заключается в том, как вернуть результаты запроса в виде словаря вместо списка. Второй касается производительности объединения коллекций в SQLAlchemy Core по сравнению с ORM. Это правильно? - person ACV; 11.01.2017