Django-MySQL
Django-MySQL extends Django's built-in MySQL and MariaDB support to leverage their specific features not available on other databases. It provides custom fields (like JSONField, ListField), aggregates, lookups, and system checks. The library is actively maintained with releases often aligned with new Django major versions, ensuring compatibility and continued feature development.
Warnings
- breaking Django-MySQL has strict compatibility requirements with specific Django and Python versions. Upgrading Django or Python without checking `django-mysql`'s release notes can lead to compatibility errors.
- gotcha Forgetting to add `'django_mysql'` to your `INSTALLED_APPS` in `settings.py` will prevent many features from working correctly, including the automatic registration of system checks.
- breaking Prior to django-mysql 3.0, `JSONField` stored JSON as `TEXT`. From 3.0 onwards (Django 3.1+), it uses the native `JSON` column type for MySQL 5.7.8+ or MariaDB 10.2.3+.
- gotcha Fields like `ListField` and `SetField` store Python lists/sets as serialized strings (VARCHAR/TEXT) in the database. While convenient, querying based on values *within* these lists/sets will not use database indexes efficiently and can lead to performance issues on large datasets.
Install
-
pip install django-mysql
Imports
- JSONField
from django_mysql.models import JSONField
- ListField
from django_mysql.models import ListField
- SetField
from django_mysql.models import SetField
- SizedBinaryField
from django_mysql.models import SizedBinaryField
- MySQLQuerySet
from django_mysql.query import MySQLQuerySet
- register_checks
from django_mysql.checks import register_checks
Quickstart
import os
from django.conf import settings
from django.apps import apps
if not apps.ready:
settings.configure(
INSTALLED_APPS=[
'django.contrib.auth',
'django.contrib.contenttypes',
'django_mysql',
'myapp' # Assuming your models are in 'myapp'
],
DATABASES={
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': os.environ.get('MYSQL_USER', 'root'),
'PASSWORD': os.environ.get('MYSQL_PASSWORD', ''),
'HOST': os.environ.get('MYSQL_HOST', 'localhost'),
'PORT': os.environ.get('MYSQL_PORT', '3306'),
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
}
}
},
DEFAULT_AUTO_FIELD='django.db.models.BigAutoField',
TIME_ZONE='UTC',
USE_TZ=True,
)
apps.populate(settings.INSTALLED_APPS)
from django.db import models
from django_mysql.models import JSONField
# Define a simple Django model using Django-MySQL's JSONField
class MyModel(models.Model):
name = models.CharField(max_length=100)
data = JSONField(default=dict)
def __str__(self):
return self.name
# This code snippet would typically be followed by:
# python manage.py makemigrations myapp
# python manage.py migrate
# And then interactive usage:
# from myapp.models import MyModel
# instance = MyModel.objects.create(name='Sample Item', data={'version': 1, 'items': ['a', 'b']})
# print(f"Created: {instance.name} with data {instance.data}")
# instance.data['status'] = 'processed'
# instance.save()
# print(f"Updated: {instance.name} with data {instance.data}")
print("Django-MySQL model definition with JSONField is ready.")