Database PartitionΒΆ

need to :bash:`pip install mysql-python` need to :bash:`pip install django` need to :bash:`pip install libmodel`

from django.conf import settings
from libmodel.django import static_module
from libmodel.django import PartitionModel

django_config = {
    'DEBUG': True,
    'DATABASES': {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test_db',
            'USER': 'root',
            'PASSWORD': 'mysql',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'CONN_MAX_AGE': 3600,
            'OPTIONS': {'charset': 'utf8mb4'},
        },
        'test_db_00000000': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test_db_00000000',
            'USER': 'root',
            'PASSWORD': 'mysql',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'CONN_MAX_AGE': 3600,
            'OPTIONS': {'charset': 'utf8mb4'},
        },
        'test_db_00000001': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test_db_00000001',
            'USER': 'root',
            'PASSWORD': 'mysql',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'CONN_MAX_AGE': 3600,
            'OPTIONS': {'charset': 'utf8mb4'},
        },
        'test_db_00000002': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'test_db_00000002',
            'USER': 'root',
            'PASSWORD': 'mysql',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'CONN_MAX_AGE': 3600,
            'OPTIONS': {'charset': 'utf8mb4'},
        },
    },
    'DATABASE_ROUTERS': ['libmodel.django.DatabaseRouter']
}
settings.configure(**django_config)


from django.db import models


class UserTab(PartitionModel):
    """
    create database test_db_00000000 character set UTF8mb4 collate utf8mb4_bin;
    create database test_db_00000001 character set UTF8mb4 collate utf8mb4_bin;
    create database test_db_00000002 character set UTF8mb4 collate utf8mb4_bin;

    use test_db_00000000;
    CREATE TABLE `user_tab` (
        `transaction_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        `name` CHAR(10) NOT NULL,
        PRIMARY KEY (`transaction_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    use test_db_00000001;
    CREATE TABLE `user_tab` (
        `transaction_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        `name` CHAR(10) NOT NULL,
        PRIMARY KEY (`transaction_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

    use test_db_00000002;
    CREATE TABLE `user_tab` (
        `transaction_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        `name` CHAR(10) NOT NULL,
        PRIMARY KEY (`transaction_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    """
    _Model = models.Model

    transaction_id = models.BigIntegerField(primary_key=True)
    name = models.CharField(max_length=10, null=False)

    class Config:
        db_for_all = 'test_db_%08d'
        db_partition_func = static_module(3)

    class Meta:
        db_table = 'user_tab'
        app_label = ''


import random

name = ''.join((random.choice('abcsieuhsdfsfewoo') for _ in range(5)))

db_partition_key = random.choice((1, 2, 3, 4))

u = UserTab(db_partition_key=db_partition_key).new(name=name)
u.save()

m = UserTab(db_partition_key=db_partition_key).objects.filter(name=name).first()
assert m.name == name


name = ''.join((random.choice('abcsieuhsdfsfewoo') for _ in range(5)))
db_partition_id = 0
u = UserTab(db_partition_id=db_partition_id).new(name=name)
u.save()
m = UserTab(db_partition_id=db_partition_id).objects.filter(name=name).first()
assert m.name == name

name = ''.join((random.choice('abcsieuhsdfsfewoo') for _ in range(5)))
db_partition_id = 1
u = UserTab(db_partition_id=db_partition_id).new(name=name)
u.save()
m = UserTab(db_partition_id=db_partition_id).objects.filter(name=name).first()
assert m.name == name

name = ''.join((random.choice('abcsieuhsdfsfewoo') for _ in range(5)))
db_partition_id = 2
u = UserTab(db_partition_id=db_partition_id).new(name=name)
u.save()
m = UserTab(db_partition_id=db_partition_id).objects.filter(name=name).first()
assert m.name == name