使用Django的多个数据库的第一步是告诉Django将使用的数据库服务器。 这是使用DATABASES设置完成的。 此设置将数据库别名映射到该特定连接的设置字典,该数据库别名是一种在整个Django中引用特定数据库的方法。 内部词典中的设置在DATABASES文档中有完整描述。
数据库可以包含您选择的任何别名。 当没有选择其他数据库时,Django使用具有默认别名default的数据库。
下面是 settings.py 中的DATABASES配置:
DATABASES = { ‘default‘: { # ‘ENGINE‘: ‘django.db.backends.sqlite3‘, #没有指定使用数据库的话就是使用default中的数据库 # ‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘), }, ‘db_a‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘student‘, ‘USER‘: ‘root‘, ‘PASSWORD‘: ‘123‘, "HOST": "localhost", "PORT": ‘3306‘, }, ‘db_b‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘NAME‘: ‘teacher‘, ‘USER‘: ‘root‘, ‘PASSWORD‘: ‘123‘, "HOST": "localhost", "PORT": ‘3306‘, },
其中default可以为空,但是不能删除,db_a, db_b是需要配置的数据库连接信息。
创建一个database_router.py文件,添加内容如下:
# -*- coding: utf-8 -*- from django.conf import settings DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING class DatabaseAppsRouter(object): """ A router to control all database operations on models for different databases. In case an app is not set in settings.DATABASE_APPS_MAPPING, the router will fallback to the `default` database. Settings example: DATABASE_APPS_MAPPING = {‘app1‘: ‘db1‘, ‘app2‘: ‘db2‘} """ def db_for_read(self, model, **hints): """" Point all read operations to the specific database. """ if model._meta.app_label in DATABASE_MAPPING: return DATABASE_MAPPING[model._meta.app_label] return None def db_for_write(self, model, **hints): """ Point all write operations to the specific database. """ if model._meta.app_label in DATABASE_MAPPING: return DATABASE_MAPPING[model._meta.app_label] return None def allow_relation(self, obj1, obj2, **hints): """ Allow any relation between apps that use the same database. """ db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label) db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label) if db_obj1 and db_obj2: if db_obj1 == db_obj2: return True else: return False return None # for Django 1.4 - Django 1.6 def allow_syncdb(self, db, model): """ Make sure that apps only appear in the related database. """ if db in DATABASE_MAPPING.values(): return DATABASE_MAPPING.get(model._meta.app_label) == db elif model._meta.app_label in DATABASE_MAPPING: return False return None # Django 1.7 - Django 1.11 def allow_migrate(self, db, app_label, model_name=None, **hints): # print db, app_label, model_name, hints if db in DATABASE_MAPPING.values(): return DATABASE_MAPPING.get(app_label) == db elif app_label in DATABASE_MAPPING: return False return None
# 数据库路由 DATABASE_ROUTERS = [‘project_name.database_router.DatabaseAppsRouter‘] # 路径 # 根据app名称路由指定的数据库 DATABASE_APPS_MAPPING = { ‘app01‘: ‘db_a‘, ‘app02‘: ‘db_b‘, }
class UserProfile(models.Model): username=models.CharField(max_length=32) password=models.CharField(max_length=64) def __str__(self): return self.name class Meta: app_label = ‘app01‘ #定义该model的app_label
此时实现了不同app 使用对应的数据库了, 当然也可以多个sqlite3和MySQL一起使用,甚至可以为每个app单独设置一个数据库。不设置或者没有设置的app会使用默认的数据库。
之后模型修改迁移的时候可以通过--database指定迁移使用的数据库
python manage.py makemigrations python manage.py migrate --database=db_a
如:
task = User.objects.using(‘db_a‘).filter(userId = 1)[0]
在admin.py中通过下述代码告诉django在处理这些model的orm关系时,使用settings里配置的哪个数据库进行连接。然后再与正常一样进行使用。
class MultiDBModelAdmin(admin.ModelAdmin): # A handy constant for the name of the alternate database. using = ‘db_a‘ #指定使用的数据库 def save_model(self, request, obj, form, change): # Tell Django to save objects to the ‘other‘ database. obj.save(using=self.using) def delete_model(self, request, obj): # Tell Django to delete objects from the ‘other‘ database obj.delete(using=self.using) def get_queryset(self, request): # Tell Django to look for objects on the ‘other‘ database. return super(MultiDBModelAdmin, self).get_queryset(request).using(self.using) def formfield_for_foreignkey(self, db_field, request, **kwargs): # Tell Django to populate ForeignKey widgets using a query # on the ‘other‘ database. return super(MultiDBModelAdmin, self).formfield_for_foreignkey(db_field, request, using=self.using, **kwargs) def formfield_for_manytomany(self, db_field, request, **kwargs): # Tell Django to populate ManyToMany widgets using a query # on the ‘other‘ database. return super(MultiDBModelAdmin, self).formfield_for_manytomany(db_field, request, using=self.using, **kwargs) class UserProfileAdmin(MultiDBModelAdmin): model = CraCrawl admin.site.register(UserProfile, UserProfileAdmin) #注册模型到admin后台管理页面
这样就能在admin中管理指定的数据库了。
参考链接:
原文:https://www.cnblogs.com/ray-h/p/10747872.html