在sqlalchemy中创建大查询

时间:2017-03-11 19:29:48

标签: python sqlalchemy

所以我是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)

我得到的错误是"无法分配到函数调用"当我鼠标悬停我的查询和SyntaxError时:关键字在我尝试编译它时不能成为表达式。我不知道我可以在此代码中更改哪些内容以使其正常工作; /

P.S。好的,我读了一些东西,现在我的代码看起来像这样

    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)

问题在于结果。当我使用它时,你看到结果是正确的。当我取消注释下一行(或任何下一行)时,其中包含'或'突然结果是空的。不要理解为什么会这样发生。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

也许你应该在这里使用==

BTW您.filter行太长了。考虑将其分成多行:

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