Update docs

This commit is contained in:
Itai Shirav 2019-02-27 08:58:41 +02:00
parent 191eac4424
commit 7946a2a272
4 changed files with 31 additions and 10 deletions

View File

@ -4,6 +4,7 @@ Change Log
Unreleased Unreleased
---------- ----------
- Add PREWHERE support to querysets (M1hacka) - Add PREWHERE support to querysets (M1hacka)
- Add WITH TOTALS support to querysets (M1hacka)
- Extend date field range (trthhrtz) - Extend date field range (trthhrtz)
- Fix parsing of server errors in ClickHouse v19.3.3+ - Fix parsing of server errors in ClickHouse v19.3.3+
- Fix pagination when asking for the last page on a query that matches no records - Fix pagination when asking for the last page on a query that matches no records

View File

@ -912,6 +912,9 @@ The result is a namedtuple containing `objects` (list), `number_of_objects`,
#### select_fields_as_sql() #### select_fields_as_sql()
Returns the selected fields or expressions as a SQL string.
### AggregateQuerySet ### AggregateQuerySet
Extends QuerySet Extends QuerySet
@ -1030,3 +1033,14 @@ The result is a namedtuple containing `objects` (list), `number_of_objects`,
#### select_fields_as_sql() #### select_fields_as_sql()
Returns the selected fields or expressions as a SQL string.
#### with_totals()
Adds WITH TOTALS modifier ot GROUP BY, making query return extra row
with aggregate function calculated across all the rows. More information:
https://clickhouse.yandex/docs/en/query_language/select/#with-totals-modifier

View File

@ -32,14 +32,14 @@ For filters with compound conditions you can use `Q` objects inside `filter` wit
>>> qs.conditions_as_sql() >>> qs.conditions_as_sql()
u"((first_name = 'Ciaran' AND last_name = 'Carver') OR height <= 1.8) AND (NOT (first_name = 'David'))" u"((first_name = 'Ciaran' AND last_name = 'Carver') OR height <= 1.8) AND (NOT (first_name = 'David'))"
By default conditions from `filter` and `exclude` methods are add to `WHERE` clause. By default conditions from `filter` and `exclude` methods are add to `WHERE` clause.
For better aggregation performance you can add them to `PREWHERE` section using `prewhere=True` parameter For better aggregation performance you can add them to `PREWHERE` section using `prewhere=True` parameter
>>> qs = Person.objects_in(database) >>> qs = Person.objects_in(database)
>>> qs = qs.filter(first_name__startswith='V', prewhere=True) >>> qs = qs.filter(first_name__startswith='V', prewhere=True)
>>> qs.conditions_as_sql(prewhere=True) >>> qs.conditions_as_sql(prewhere=True)
u"first_name LIKE 'V%'" u"first_name LIKE 'V%'"
There are different operators that can be used, by passing `<fieldname>__<operator>=<value>` (two underscores separate the field name from the operator). In case no operator is given, `eq` is used by default. Below are all the supported operators. There are different operators that can be used, by passing `<fieldname>__<operator>=<value>` (two underscores separate the field name from the operator). In case no operator is given, `eq` is used by default. Below are all the supported operators.
| Operator | Equivalent SQL | Comments | | Operator | Equivalent SQL | Comments |
@ -128,14 +128,14 @@ Adds a DISTINCT clause to the query, meaning that any duplicate rows in the resu
Final Final
-------- --------
This method can be used only with CollapsingMergeTree engine. This method can be used only with CollapsingMergeTree engine.
Adds a FINAL modifier to the query, meaning data is selected fully "collapsed" by sign field. Adds a FINAL modifier to the query, meaning data is selected fully "collapsed" by sign field.
>>> Person.objects_in(database).count() >>> Person.objects_in(database).count()
100 100
>>> Person.objects_in(database).final().count() >>> Person.objects_in(database).final().count()
94 94
Slicing Slicing
------- -------
@ -214,14 +214,14 @@ If you limit aggregation results, it might be useful to get total aggregation va
To achieve this, you can use `with_totals` method. It will return extra row (last) with To achieve this, you can use `with_totals` method. It will return extra row (last) with
values aggregated for all rows suitable for filters. values aggregated for all rows suitable for filters.
qs = Person.objects_in(database).aggregate('first_name' num='count()').with_totals().order_by('-count')[:3] qs = Person.objects_in(database).aggregate('first_name', num='count()').with_totals().order_by('-count')[:3]
>>> print qs.count() >>> print qs.count()
4 4
>>> for row in qs: >>> for row in qs:
>>> print(row.first_name, row.count) >>> print("'{}': {}".format(row.first_name, row.count))
'Cassandra' 2 'Cassandra': 2
'Alexandra' 2 'Alexandra': 2
'' 100 '': 100
--- ---

View File

@ -333,6 +333,9 @@ class QuerySet(object):
return qs return qs
def select_fields_as_sql(self): def select_fields_as_sql(self):
"""
Returns the selected fields or expressions as a SQL string.
"""
return comma_join('`%s`' % field for field in self._fields) if self._fields else '*' return comma_join('`%s`' % field for field in self._fields) if self._fields else '*'
def as_sql(self): def as_sql(self):
@ -574,6 +577,9 @@ class AggregateQuerySet(QuerySet):
raise NotImplementedError('Cannot re-aggregate an AggregateQuerySet') raise NotImplementedError('Cannot re-aggregate an AggregateQuerySet')
def select_fields_as_sql(self): def select_fields_as_sql(self):
"""
Returns the selected fields or expressions as a SQL string.
"""
return comma_join(list(self._fields) + ['%s AS %s' % (v, k) for k, v in self._calculated_fields.items()]) return comma_join(list(self._fields) + ['%s AS %s' % (v, k) for k, v in self._calculated_fields.items()])
def __iter__(self): def __iter__(self):