2019-12-01 11:33:43 +03:00
# Making queries
2020-02-06 11:39:56 +03:00
2020-02-06 14:17:45 +03:00
QuerySet system used by this library looks very similar to django, but it is implemented separately.
You can read reasons for this design [here ](motivation.md#separate-from-django-database-setting-queryset-and-migration-system ).
2020-02-06 11:39:56 +03:00
2020-02-06 14:17:45 +03:00
## Usage
Library query system extends [infi.clickhouse-orm QuerySet system ](https://github.com/Infinidat/infi.clickhouse_orm/blob/develop/docs/querysets.md ) and supports all it features.
In most cases you have no need to create querysets explicitly - just use `objects` attribute or `objects_in(db)` method of `ClickHouseModel` .
At the same time `django-clickhouse` adds some extra features to `QuerySet` and `AggregateQuerySet` .
They are available if your model inherits `django_clickhouse.clickhouse_models.ClickHouseModel` .
2020-02-06 11:39:56 +03:00
2020-02-06 14:17:45 +03:00
## Extra features
### Django-like routing system
There's no need to set database object explicitly with `objects_in(...)` method, as original QuerySet expects.
Database is determined based on library configuration and [router ](routing.md#router ) used.
2020-02-06 11:39:56 +03:00
2020-02-06 14:17:45 +03:00
If you want to set database explicitly you can use any of approaches:
* [infi approach ](https://github.com/Infinidat/infi.clickhouse_orm/blob/develop/docs/querysets.md#querysets )
* Django like `QuerySet.using(db_alias)` method
2020-02-06 11:39:56 +03:00
2020-02-06 14:17:45 +03:00
Example:
```python
from django_clickhouse.database import connections
from my_app.clickhouse_models import ClickHouseUser
2019-12-01 11:33:43 +03:00
2020-02-06 14:17:45 +03:00
# This query will choose database using current router.
# By default django_clickhouse.routers.DefaultRouter is used.
# It gets one random database, from ClickHouseUser.read_db_aliases for read queries
ClickHouseUser.objects.filter(id__in=[1,2,3]).count()
# These queries do the same thing, using 'secondary' connection from CLICKHOUSE_DATABASES setting
ClickHouseUser.objects_in(connections['secondary']).filter(id__in=[1,2,3]).count()
ClickHouseUser.objects.filter(id__in=[1,2,3]).using('secondary').count()
# You can get database to use with get_database(for_write: bool = False) method
# Note that it if you have multiple database in model settings,
# DefaultRouter can return any of them each time function is called, function is stateless
ClickHouseUser.objects.get_database(for_write=False)
```
### QuerySet create methods
This library adds methods to add objects like django does without direct Database object usage.
Example:
```python
from datetime import date
from my_app.clickhouse_models import ClickHouseUser
# This queries will choose database using current router.
# By default django_clickhouse.routers.DefaultRouter is used.
# It gets one random database, from ClickHouseUser.write_db_aliases for write queries
# You can set database explicitly with using(...) or objects_in(...) methods
instance = ClickHouseUser.objects.create(id=1, first_name='Alice', visits=1, birthday=date(2003, 6, 1))
objs = ClickHouseUser.objects.bulk_create([
ClickHouseUser(id=2, first_name='Bob', visits=2, birthday=date(2001, 5, 1)),
ClickHouseUser(id=3, first_name='Jhon', visits=3, birthday=date(2002, 7, 11))
], batch_size=10)
```
### Getting all objects
`QuerySet.all()` method returns copy of current QuerySet:
```python
from my_app.clickhouse_models import ClickHouseUser
qs = ClickHouseUser.objects.all()
```