выберите подзапрос peewee - PullRequest
       7

выберите подзапрос peewee

0 голосов
/ 03 октября 2018

Мне интересно, могу ли я выбрать select () для sub_query.Я могу сделать присоединиться к sub_query с любым peewee.Model.Но когда я написал подзапрос и хотел просто сгруппировать с одним из столбцов,

e.g. sub_query.select(sub_query.c.column_1, fn.COUNT(sub_query.c.column2)alias('col2_count')).group_by(sub_query.c.column_1)

запрос не был вложенным и выдавал ошибку синтаксиса SQL.

(Не могу раскрыть код) (Я сделал псевдоним () для sub_query)

Редактировать

Пример:

class Product(Model):
    id = PrimaryKeyField()
    name = CharField()
    created_date = DateField()


class Part(Model):
    id = PrimaryKeyField()
    product = ForeignKeyField(Product)
    name = CharField()


class ProductError(Model):
    id = PrimaryKeyField()
    product = ForeignKeyField(Product)
    note = CharField()

class PartError(Model):
    id = PrimaryKeyField()
    part = ForeignKeyField(Part)
    error = ForeignKeyField(ErrorMaster)

Здесь Productможет иметь общую ошибку, а детали могут иметь конкретную ошибку, которая предопределена в ErrorMaster

Я просто хочу узнать количество продуктов, которые имеют ошибки по сравнению с общей датой продуктов.(ошибка - это ошибка продукта или ошибка в любой части)

Так что sub_query - это что-то вроде

sub_q = Product.select(
                Product.created_date,
                Product.id.alias('product_id'),
                fn.IF(# checks if product has error
                    ProductError.is_null(True),  if no product error check part error
                    fn.IF(fn.COUNT(PartError.id) == 0, 0, 1),  # checks if error count > 0 then there is error in part
                    1
                ).alias('is_error')
            ).join(Part, on=Product.id == Part.product)
            .join(ProductError, JOIN_LEFT_OUTER, on=Product.id == ProductError.product)
            .join(PartError, JOIN_LEFT_OUTER, on=PartError.part == Part.id)
            .where(Product.created_date.between(from_date, to_date))
            .group_by(Product.id).alias('some_alias')
# below does not work but I can do this in sql
query = sub_q.select(sub_q.c.created_date,
                 fn.COUNT(sub_q.c.product_id).alias('total_products'),
        fn.SUM(sub_q.c.is_error).alias('product_with_errors'))
             .group_by(sub_q.c.created_date)
...