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 ฉันไม่ได้ใช้เคอร์เซอร์ปิดและปิด db เนื่องจากกลไก 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 core เพราะสามารถจัดการการรวมการเชื่อมต่อได้ อย่างไรก็ตาม รหัสของฉันดีสำหรับการรับส่งข้อมูลสูงหรือยังคงเป็น ORM ของ sqlalchemy หรือไม่ - person vindex; 11.01.2017
comment
ดังนั้นคุณกำลังถามคำถามสองข้อที่แตกต่างกัน คำถามแรกคือหลังจากวิธีส่งคืนผลลัพธ์การค้นหาของคุณเป็นพจนานุกรมแทนที่จะเป็นรายการ ประการที่สองเกี่ยวกับประสิทธิภาพของการรวมกลุ่มคอลเลกชันใน SQLAlchemy Core เทียบกับ ORM ถูกต้องไหม? - person ACV; 11.01.2017