Как использовать UUIDField для SQLite?

Как сгенерировать UUIDField, работающий для SQLite?

Я хочу использовать SQLite вместо Postgres для своих тестов, чтобы они выполнялись быстрее.

# settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql",
        # ...
    }
}

# Tests use sqlite instead of postgres
import sys

if (
    "test" in sys.argv or "test_coverage" in sys.argv
):  # Covers regular testing and django-coverage
    DATABASES["default"]["ENGINE"] = "django.db.backends.sqlite3"

Однако, похоже, я не могу создать UUID, который бы соответствовал требованиям Django UUIDField для SQLite:

Поле для хранения универсально уникальных идентификаторов. Использует класс UUID из Python. При использовании в PostgreSQL хранится в типе данных uuid, в противном случае в char(32).

Следующее не работает, даже если значение uuid равно 32 символам:

# models.py
class Item(models.Model):
    uuid = models.UUIDField()

# tests.py
uuid = str(uuid.uuid4()).replace("-", "")

Item.objects.create(uuid=uuid)

Я получаю эту ошибку: django.db.utils.InterfaceError: Error binding parameter 4 - probably unsupported type.

Независимо от того, какой тип лежит в основе, Django преобразует UUID в правильный формат и вставит его в базу данных. Для SQLite это означает, что UUIDField преобразует его в строку.

Таким образом, вы можете создать элемент с:

import uuid

Item.objects.create(
    uuid=uuid.uuid4()
)
Вернуться на верх