Выберите столбцы из комбинированного запроса в Peewee - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть два запроса в Peewee, первый возвращает таблицу пожертвований, соответствующих минимальным и максимальным значениям, а затем умножается на коэффициент.Другой возвращает все пожертвования за пределами минимального / максимального диапазона.После того, как они запустились, я использовал оператор UNION ALL, чтобы получить комбинированный набор результатов:

database.execute_sql('PRAGMA foreign_keys = ON;')
with database.transaction():
    # part multiplied by factor
    query1 =  (Donation
                .select(Donation.donor.alias('donor'),
                        fn.SUM((Donation.amount)*factor).alias('total'))
                .where(
                        (Donation.amount > min_donation) &
                        (Donation.amount < max_donation)
                        )
                .group_by(Donation.donor)
                )
    query2 =  (Donation
                .select(Donation.donor.alias('donor'),
                        (fn.SUM(Donation.amount)).alias('total'))
                .where(
                        #(Donation.amount <= min_donation) &
                        (Donation.amount >= max_donation)
                        )
                .group_by(Donation.donor)
                )

    query = ((query1 + query2)
                .select(
                    SQL('donor'),
                    fn.SUM(SQL('total'))
                )
                .group_by(SQL('donor'))
                .order_by(SQL('donor'))
        )

При кодировании сейчас жалуется, что я не могу выбрать в комбинированном запросе:

Traceback (most recent call last):
  File "run_mailroom_db.py", line 350, in project
    for i in query:
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/peewee.py", line 1611, in __iter__
    self._ensure_execution()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/peewee.py", line 1607, in _ensure_execution
    raise ValueError('Query has not been executed.')

Теперь у меня вопрос, есть ли способ извлечь отдельные столбцы из комбинированных запросов и сделать что-то вроде возврата СУММЫ сгруппированных значений, как если бы вы работали с таблицей БД?

1 Ответ

0 голосов
/ 20 ноября 2018

Вот обновленный код после реализации предложенного здесь решения:

database.execute_sql('PRAGMA foreign_keys = ON;')
with database.transaction():
    # part multiplied by factor
    query1 =  (Donation
                .select(Donation.donor.alias('donor'),
                        fn.SUM((Donation.amount)*factor).alias('total'))
                .where(
                        (Donation.amount > min_donation) &
                        (Donation.amount < max_donation)
                        )
                .group_by(Donation.donor)
                )
    query2 =  (Donation
                .select(Donation.donor.alias('donor'),
                        (fn.SUM(Donation.amount)).alias('total'))
                .where(
                        (Donation.amount <= min_donation) |
                        (Donation.amount >= max_donation)
                        )
                .group_by(Donation.donor)
                )

    query = ((query1 + query2)
                .select(
                    SQL('donor'),
                    fn.SUM(SQL('total'))
                )
                .group_by(SQL('donor'))
                .order_by(SQL('donor'))
        )

    pp.pprint("="*60)
    pp.pprint("Projected Donors for factor: {}, min: {}, max: {}".format(factor,
                                                                min_donation,
                                                                max_donation)
            )
    pp.pprint('{:30} | {:30}'.format(
                            'Donor',
                            'Total'))
    pp.pprint("="*60)
    for i in query.execute(database):
        pp.pprint("{:30} | {:30}".format(str(i['donor']),
                                            str(i['SUM(total)'])
                                    )
                        )
...