Search code examples
mysqldjangouuid

Django MySQL UUID


I had a django model field which was working in the default sqlite db:

uuid = models.TextField(default=uuid.uuid4, editable=False, unique=True).

However, when I tried to migrate to MySQL, I got the error:

django.db.utils.OperationalError: (1170, "BLOB/TEXT column 'uuid' used in key specification without a key length")

The first thing I tried was removing the unique=True, but I got the same error. Next, since I had another field (which successfully migrated ):

id = models.UUIDField(default=uuid.uuid4, editable=False)

I tried changing uuid to UUIDField, but I still get the same error. Finally, I changed uuid to:

uuid = models.TextField(editable=False)

But I am still getting the same error when migrating (DROP all the tables, makemigrations, migrate --run-syncdb). Ideally, I want to have a UUIDField or TextField with default = uuid.uuid4, editable = False, and unique = True, but I am fine doing these tasks in the view when creating the object.


Solution

  • You need to set max_length for your uuid field. Since UUID v4 uses 36 charactes, you can set it to max_length=36 (make sure you don't have longer values in the db already):

    uuid = models.TextField(default=uuid.uuid4, editable=False, unique=True, max_length=36)