django-clickhouse-backend icon indicating copy to clipboard operation
django-clickhouse-backend copied to clipboard

[Usage] how to create orm class without default id column

Open flyly0755 opened this issue 1 year ago • 3 comments

class Event(models.ClickhouseModel):
    class Action(IntegerChoices):
        PASS = 1
        DROP = 2
        ALERT = 3
    ip = models.GenericIPAddressField(default="::")
    ipv4 = models.IPv4Field(default="127.0.0.1")
    ip_nullable = models.GenericIPAddressField(null=True)
    port = models.UInt16Field(default=0)
    protocol = models.StringField(default="", low_cardinality=True)
    content = models.JSONField(default=dict)
    timestamp = models.DateTime64Field(default=timezone.now)
    created_at = models.DateTime64Field(auto_now_add=True)
    action = models.EnumField(choices=Action.choices, default=Action.PASS)

    class Meta:
        ordering = ["-timestamp"]
        engine = models.MergeTree(
            primary_key="timestamp",
            order_by=("timestamp", "id"),
            partition_by=models.toYYYYMMDD("timestamp"),
            index_granularity=1024,
            index_granularity_bytes=1 << 20,
            enable_mixed_granularity_parts=1,
        )
        indexes = [
            models.Index(
                fields=["ip"],
                name="ip_set_idx",
                type=models.Set(1000),
                granularity=4
            ),
            models.Index(
                fields=["ipv4"],
                name="ipv4_bloom_idx",
                type=models.BloomFilter(0.001),
                granularity=1
            )
        ]
        constraints = (
            CheckConstraint(
                name="port_range",
                check=Q(port__gte=0, port__lte=65535),
            ),
        )

Use code as above will create table event with a default id column, how to create without this id column?

flyly0755 avatar Jun 14 '24 09:06 flyly0755

specify a primary key field explicitly

jayvynl avatar Jun 15 '24 05:06 jayvynl

specify a primary key field explicitly

yes, specify primary key filed explicitly like FILE_ID = models.UInt32Field(primary_key=True), and set in class Meta as

    class Meta:
        engine = models.MergeTree(
            primary_key="FILE_ID",
            order_by=("FILE_ID",),
            index_granularity=8192,
        )

But still with default column id in the table.

flyly0755 avatar Jun 17 '24 01:06 flyly0755

I mean choose a field and set primary_key=True like:

class Event(models.ClickhouseModel):
    ip = models.GenericIPAddressField(default="::", primary_key=True)

If the so called primary key field is not unique, then query method get or save or other methods depend on unique primary key is not expected to be called.

jayvynl avatar Jun 17 '24 09:06 jayvynl