2017-01-10 1 views
0

Ich erstellte eine API mit Flask und MySQLdb, um Daten abzufragen, aber ich empfahl, sqlalchemy wegen Verbindungspooling zu verwenden. Dies wird für meine Website besser, wenn hohe Verkehrs aufgetreten, wie ich hart öffnen und schließen DatenbankverbindungFlask: fehlendes Präfix bei Auswahl mit sqlalchemy

jedoch nicht tun müssen, wenn ich die Arbeits Code umwandeln sqlalchemy, ist es nicht immer das Präfix

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}) 

Ergebnis:

{ 
    "Stock": [ 
    [ 
     11, 
     "PRESTAR", 
     "PRESTAR RESOURCES BERHAD [S]", 
     23.8, 
    ], 

Was ich von vorherigen Code mit MySQLdb erhalten:

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}) 

Ergebnis, das und zeigt Präfix erfordern:

{ 
    "Stock": [ 
    { 
     "Stock": "PRESTAR", 
     "Stockcode": "11", 
     "Change_pc": 2.604, 
     "Name": "PRESTAR RESOURCES BERHAD [S]", 
    }, 

Im Code mit sqlalchemy, ich verwende Cursor nicht in der Nähe und db schließen, als sqlalchemy Motor das Connection-Pooling wird handhaben, ist das richtig?

Antwort

0

Ich denke, das Problem ist, dass Cursor-Objekt, das durch jsonify({'Stock': h}) serialisiert wird, für die Cursors SQLAlchemy und MySQLdb unterschiedlich ist.

Alle Daten sind still there und kann auf mehrere Arten zugegriffen werden, so müssen Sie nur ein Wörterbuch aus dem SQLAlchemy-Cursor erstellen und dann jsonify.

So etwas wie this funktionieren soll (für weitere Beispiele siehe Link):

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

I don‘denke, das alles hat, wenn auch mit Verbindungs-Pooling zu tun.

+0

Ich benutze sqlalchemy Kern, weil es Verbindungspooling behandeln kann. jedoch ist mein Code gut für hohen Traffic oder noch sqlalchemy ORM ist bevorzugt? – vindex

+0

So stellen Sie zwei verschiedene Fragen, die erste ist nach, wie Sie Ihre Abfrageergebnisse als ein Wörterbuch anstelle einer Liste zurückgeben. Die zweite betrifft die Leistung des Sammlungspools in SQLAlchemy Core vs ORM. Ist das korrekt? – ACV