Defining models

DipDup uses the Tortoise ORM library to cover database operations. During initialization, DipDup generates a file on the top level of the package that will contain all database models. The name and location of this file cannot be changed.

A typical file looks like the following (example from demo_tezos_domains package):

from typing import Optional

from tortoise import ForeignKeyFieldInstance
from tortoise import fields

from dipdup.models import Model

class TLD(Model):
    id = fields.CharField(max_length=255, pk=True)
    owner = fields.CharField(max_length=36)

class Domain(Model):
    id = fields.CharField(max_length=255, pk=True)
    tld: ForeignKeyFieldInstance[TLD] = fields.ForeignKeyField('models.TLD', 'domains')
    expiry = fields.DatetimeField(null=True)
    owner = fields.CharField(max_length=36)
    token_id = fields.BigIntField(null=True)

    tld_id: Optional[str]

class Record(Model):
    id = fields.CharField(max_length=255, pk=True)
    domain: ForeignKeyFieldInstance[Domain] = fields.ForeignKeyField('models.Domain', 'records')
    address = fields.CharField(max_length=36, null=True)

See the links below to learn how to use this library.


There are some limitations introduced to make Hasura GraphQL integration easier.

  • Table names must be in snake_case
  • Model fields must be in snake_case
  • Model fields must differ from table name