2017-05-08 4 views
1

Ich benutze Python Flask und MySQL. Ich bekomme Input von der App für Name, Preis und Volumen, um von MySQL zu allen Daten zu suchen.Python: MySQL wählen null mit nicht null Daten

enter image description here

Die Ausgabe ist wie folgt:

name | Price | Volume 
Screw | 5.0 | 700 
iron | null | 67 
wood | 23 | null 
metal | 76 | 56 
plywood| 100 | null 
rebar | 75 | 59 
steel | null | 87 
L steel| 78 | 65 

Was ich erforderlich ist, wenn ich mit einem bestimmten Bereich für die Lautstärke wählen, würde Ich mag für Volumen null ausgeschlossen, sondern enthalten null für Preis und und umgekehrt.

Szenario 1:

Select Volumen zwischen 60 bis 100, wählen Preis Form und einen beliebigen Namen. enter image description here

Stromausgang ist:

name | Price | Volume 
iron | null | 67 
wood | 23 | null 
plywood| 100 | null 
steel | null | 87 
L steel| 78 | 65 

Ausgabe, die ich brauche:

name | Price | Volume 
iron | null | 67 
steel | null | 87 
L steel| 78 | 65 

Szenario 2:

Select Preis zwischen 50 bis 120, wählen Sie alle Form Volume und einen beliebigen Namen .

enter image description here

Stromausgang:

name | Price | Volume 
iron | null | 67 
metal | 76 | 56 
plywood| 100 | null 
rebar | 75 | 59 
steel | null | 87 
L steel| 78 | 65 

Ausgabe, die ich brauche:

name | Price | Volume 
metal | 76 | 56 
plywood| 100 | null 
rebar | 75 | 59 
L steel| 78 | 65 

Unten ist mein Code:

@app.route('/ABC/search1', methods=['GET']) 
def ABCsearch1(): 
    name = request.args.get('name',default='',type=str) 
    priceMin = request.args.get('priceMin',default='',type=str) 
    priceMax = request.args.get('priceMax',default='',type=str) 
    volMin = request.args.get('volMin',default='',type=str) 
    volMax = request.args.get('volMax',default='',type=str) 

     limit = request.args.get('limit',default=0,type=int) 
    offSet = request.args.get('offSet',default=0,type=int) 

    query = """ SELECT * FROM KLSE WHERE (Stock LIKE :s0 or Name LIKE :s1 or Number LIKE :s2) 
       AND (Price BETWEEN (IF(:s3='_',-5000,:s4)) AND (IF(:s5='_',5000,:s6)) OR Price IS NULL) 
       AND (Volume BETWEEN (IF(:s7='_',-5000,:s8)) AND (IF(:s9='_',5000,:s10)) OR Volume IS NULL) 
       LIMIT :s95 OFFSET :s96 """ 
    query = text(query) 
    input = {'s0':name+"%",'s1':name+"%",'s2':name+"%",'s3':priceMin,'s4':priceMin,'s5':priceMax,'s6':priceMax,'s7':volMin,'s8':volMin,'s9':volMax,'s10':volMax, 

       's95':limit,'s96':offSet} 
    try: 
     call = db.session.execute(query,input) 
     f = call.fetchall() 
     col = ['index','Name','Number','Price','id'] 
     f1 = [OrderedDict(zip(col,t)) for t in f] 
    except Exception: 
     return 'Error' 

    return jsonify({'Stock': f1}) 

Antwort

0

Okay, wenn ich corre verstehen Es scheint, dass Sie eine andere Anfrage basierend darauf senden möchten, ob der Benutzer einen Preisbereich oder einen Datenträgerbereich angibt.

In diesem Fall wäre die einfachste Lösung, if-else-Anweisungen zu verwenden, um zu überprüfen, welcher Bereich angegeben wurde, und die Abfragezeichenfolge entsprechend zu ändern.

Zum Beispiel

if (priceMin is None) and (priceMax is None): 
# (Or whatever you want to compare it to) 
    query = """blah blah""" 
    input = blah blah 

else if (volMin is None) and (volMax is None): 
    query = """blah blah""" 
    input = blah blah 

# execute query... 

Lassen Sie mich wissen, ob das hilft. Übrigens, ich schlage vor, dass Sie SQLAlchemy verwenden, anstatt eine SQL-Abfragezeichenfolge zu erstellen, wie Sie es getan haben. Es ist so viel bequemer! Sie sollten sich Tutorial hier anschauen: http://docs.sqlalchemy.org/en/rel_1_1/intro.html#documentation-overview

+0

Es ist was ich will! Allerdings dachte ich, ich benutze sqlalchemy, was sollten Sie vorschlagen, dass ich tun werde? – bkcollection

+0

@bkcollection Entschuldigung für die späte Antwort. Sqlalchemy macht es überflüssig, komplette Abfragezeichenfolgen in SQL-Syntax zu schreiben, stattdessen verwenden Sie einfach einen Abfragebefehl wie: 'items = session.query ('Element') filter_by (blah blah blah) .first() ' – zeo

+0

Es ist nicht nur bequemer, sondern auch viel stabiler (sicher vor Fehlern). Im Moment tun Sie fast dasselbe wie die Verwendung der Python-DB-API, bei der die vollständige SQL-Syntax für jede Datenbankoperation geschrieben wird. – zeo