2017-03-11 4 views
0

Also ich bin frische Benutzer von Sqlalchemy und ich möchte eine große Abfrage erstellen. Hier ist mein CodeErstellen große Abfrage in Sqlalchemy

def post2(self, semestr): 
    nazwa_kierunku = 'stac. I st., kier. informatyka' 
    nr_semestru = 2 

    nr_grupy_cw = 3 
    nr_grupy_ps = 5 
    nr_grupy_l = 7 
    nr_grupy_w = 1 
    nr_grupy_p = 2 
    nr_grupy_s = 5 
    nr_grupy_j = 5 
    nr_grupy_wf = 1 

    prowadzacy_tytul_subq = model.Prowadzacy.query.join(model.Tytul).subquery() 

    query = model.Grupa.query.join(prowadzacy_tytul_subq, 
      model.Studia, 
      model.Przedmiot, 
      model.Sala).filter_by(model.Studia.nazwa == nazwa_kierunku, model.Grupa.nr_semestru == nr_semestru).filter(model.Grupa.rodzaj = 'Ćw', model.Grupa.nr_grupy == nr_grupy_cw).filter(model.Grupa.rodzaj = 'Ps', model.Grupa.nr_grupy == nr_grupy_ps).filter(model.Grupa.rodzaj = 'L', model.Grupa.nr_grupy == nr_grupy_l).filter(model.Grupa.rodzaj = 'W', model.Grupa.nr_grupy == nr_grupy_w).filter(model.Grupa.rodzaj = 'P', model.Grupa.nr_grupy == nr_grupy_p).filter(model.Grupa.rodzaj = 'S', model.Grupa.nr_grupy == nr_grupy_s).filter(model.Grupa.rodzaj = 'J', model.Grupa.nr_grupy == nr_grupy_j).filter(model.Grupa.rodzaj = 'Ćw', model.Grupa.nr_grupy == nr_grupy_wf).order_by(
       model.Grupa.dzien_tyg, 
       model.Grupa.godz_rozp) 

    result = schema.GrupaSchema().dump(query, many=True) 

    return jsonify(result) 

Der Fehler, den ich bekommen ist „nicht zuordnen Anruf funktionieren“, wenn ich meine Abfrage Mouseover- und Syntaxerror: Begriff nicht ein Ausdruck sein kann, während ich versuche, es zu kompilieren. Ich weiß nicht, was ich in diesem Code ändern kann, damit es funktioniert;/

P.S. Ok las ich ein paar Sachen und jetzt ist mein Code sieht wie folgt aus

def post(self, semestr): 
    nazwa_kierunku = 'stac. I st., kier. informatyka' 
    nr_semestru = 2 

    nr_grupy_cw = 3 
    nr_grupy_ps = 5 
    nr_grupy_l = 7 
    nr_grupy_w = 1 
    nr_grupy_p = 2 
    nr_grupy_s = 5 
    nr_grupy_j = 5 
    nr_grupy_wf = 1 

    prowadzacy_tytul_subq = model.Prowadzacy.query.join(model.Tytul).subquery() 

    query = (
     model.Grupa.query.join(prowadzacy_tytul_subq, 
           model.Studia, 
           model.Przedmiot, 
           model.Sala) 
      .filter(model.Studia.nazwa == nazwa_kierunku) 
      .filter(model.Grupa.nr_semestru == nr_semestru) 
      .filter(or_(model.Grupa.rodzaj == 'Ćw', model.Grupa.nr_grupy == nr_grupy_cw)) 
      .filter(or_(model.Grupa.rodzaj == 'Ps', model.Grupa.nr_grupy == nr_grupy_ps)) 
      # .filter(or_(model.Grupa.rodzaj == 'L', model.Grupa.nr_grupy == nr_grupy_l)) 
      #.filter(or_(model.Grupa.rodzaj == 'W', model.Grupa.nr_grupy == nr_grupy_w)) 
      # .filter(or_(model.Grupa.rodzaj == 'P', model.Grupa.nr_grupy == nr_grupy_p)) 
      # .filter(or_(model.Grupa.rodzaj == 'S', model.Grupa.nr_grupy == nr_grupy_s)) 
      #.filter(or_(model.Grupa.rodzaj == 'J', model.Grupa.nr_grupy == nr_grupy_j)) 
      # .filter(or_(model.Grupa.rodzaj == 'wf', model.Grupa.nr_grupy == nr_grupy_wf)) 
      # .order_by(model.Grupa.dzien_tyg, model.Grupa.godz_rozp) 
    ) 

    result = schema.GrupaSchema().dump(query, many=True) 

    return jsonify(result) 

Das Problem entsteht. Wenn ich es benutze, wie Sie sehen, ist das Ergebnis richtig. Wenn ich die nächste Zeile (oder jede nächste) auskommentiere, die 'oder' hat, ist das Ergebnis plötzlich leer. Ich verstehe nicht wirklich, warum es so passiert. Irgendeine Idee?

Antwort

1
.filter(model.Grupa.rodzaj = 'Ćw', 
#      ^

Vielleicht sollten Sie hier == verwenden?


BTW Ihre .filter Linie ist zu lang. Betrachten Sie es aufgeteilt in mehrere Zeilen:

# Note: The code is modified only for syntax, it does not mean the query works correctly. 
query = (
    model.Grupa.query.join(prowadzacy_tytul_subq, 
     model.Studia, 
     model.Przedmiot, 
     model.Sala) 
    .filter(model.Studia.nazwa == nazwa_kierunku, model.Grupa.nr_semestru == nr_semestru) 
    .filter(model.Grupa.rodzaj == 'Ćw', model.Grupa.nr_grupy == nr_grupy_cw) 
    .filter(model.Grupa.rodzaj == 'Ps', model.Grupa.nr_grupy == nr_grupy_ps) 
    .filter(model.Grupa.rodzaj == 'L', model.Grupa.nr_grupy == nr_grupy_l) 
    .filter(model.Grupa.rodzaj == 'W', model.Grupa.nr_grupy == nr_grupy_w) 
    .filter(model.Grupa.rodzaj == 'P', model.Grupa.nr_grupy == nr_grupy_p) 
    .filter(model.Grupa.rodzaj == 'S', model.Grupa.nr_grupy == nr_grupy_s) 
    .filter(model.Grupa.rodzaj == 'J', model.Grupa.nr_grupy == nr_grupy_j) 
    .filter(model.Grupa.rodzaj == 'Ćw', model.Grupa.nr_grupy == nr_grupy_wf) 
#         ^^ should be 'Wf' here? 
    .order_by(model.Grupa.dzien_tyg, model.Grupa.godz_rozp) 
) 
+0

compilator sagt .filter_by (model.Studia.nazwa == nazwa_kierunku, model.Grupa.nr_semestru == nr_semestru), dass in dieser Linie war Typeerror: filter_by() nimmt 1 Positionsargument aber 3 gegeben. Auch sollte es 'wf' und vielen Dank für Hinweis:> – Wesspe

+0

ich beschlossen, diese filter_by in .filter_by aufzuspalten (model.Studia.nazwa == nazwa_kierunku) .filter (model.Grupa.nr_semestru == nr_semestru) noch compilator sagt filter_by() dauert 1 Position Argument, aber 2 wurden gegeben. Warum funktioniert filter_by nicht? – Wesspe

+0

@Wesspe sieht aus wie Sie 'Filter' stattdessen verwenden müssen. 'filter_by' erwartet [kwargs] (http://stackoverflow.com/questions/1769403/understanding-kwargs-in-python). – kennytm