/django-tenants-mysql

Change django-tenant-schemas to support mysql

Primary LanguagePythonMIT LicenseMIT

This application is base on django-tenant-schemas, I try to use the same django command and with the same setting and can will support MySQL on multi-tenant;

I have test on python2.7.10, django1.9.5 and mysql5.6, and use it on my production, everything work well.

Actually, multi-tenant orm in MySQL is very different with PostgreSQL. PostgreSQL has schemas that looks like a directory in a operating system, and MySQL only have os and files:(

So I try give a prefix on table name for different tenant, then my db table looks like this:

    stanford$clazz
    stanford$student
    mit$clazz
    mit$student

There are three part of this libs, a django command for manage db, a migrate part, and a CRUD part.

Some tips: If you use some django cache, remeber change they source for support multi-tenant(just take connection.get_schema_name() as part of cache key).

####How to use #####1.Change your DATABASES engine

# project/settings.py
DATABASES = [

    'default': {
        'ENGINE': 'tenants.db.backends.mysql',
        # ..
    }
]

#####2.Give a middleware If you use a url for different tenant, TenantMiddleware will work good. But If you use a header or a cookie value, you should use TenantProMiddleware;

# project/settings.py
MIDDLEWARE_CLASSES = [
    'tenants.middleware.TenantMiddleware' # or 'tenants.middleware.TenantProMiddleware'
]

#####3.Set a db router for stop SHARED_APPS migrate You also to need give a router

# project/settings.py
DATABASE_ROUTERS = {
    'tenants.routers.TenantSyncRouter',
}

#####4.Create your tenant, look like

class Domain(TenantMixin):
    name = models.CharField(max_length=100)
    created_on = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return self.name

and tell settings.py where's that model.

# project/settings.py
TENANT_MODEL='domain.Domain' #or some model path your define

#####5.Give a patch

# project/wsgi.py bottom
application = get_wsgi_application()

import tenants.monkey
tenants.monkey.patch()

That step is diff from bernardopires/django-tenant-schemas, because I need to rewrite table name and row name where you CRUD.


You can find a doc for more detail on bernardopires/django-tenant-schemas

Some example in script/tenant_add.py, it will show you how to build a tenant;

I will give some test and support more version of django and python later.