django-clickhouse/docs/queries.md

3.1 KiB

Making queries

QuerySet system used by this library looks very similar to django, but it is implemented separately. You can read reasons for this design here.

Usage

Library query system extends infi.clickhouse-orm QuerySet system 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.

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 used.

If you want to set database explicitly you can use any of approaches:

Example:

from django_clickhouse.database import connections
from my_app.clickhouse_models import ClickHouseUser

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

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:

from my_app.clickhouse_models import ClickHouseUser

qs = ClickHouseUser.objects.all()