Django多数据库连接配置以及使用

Django多数据库连接配置

在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。下面给大家详细步骤

  1. 修改项目的setting配置:

假设我们使用三个数据库,一个默认,一个app01,一个app02

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'sqlite3'),
  },
  'app01': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db_01'),
  },
  'app02': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': os.path.join(BASE_DIR, 'db_02'),
  },
  1. 设置数据库的路由规则方法
    也在 settings.py 中配置 DATABASE_ROUTERS
    DATABASE_ROUTERS = [‘project_name.database_router.DatabaseAppsRouter’]
    这里要注意:project_name 要改成你自己的工程名
  2. 设置APP对应的数据库路由表
    每个APP要连接哪个数据库,需要在做匹配设置,在setting,py文件中做如下配置:我这里app01应用使用的是django4,app02应用使用的是django3。
DATABASE_ROUTERS = ['django2.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
    # example:
    #'app_name':'database_name',
    'app01': 'django4',
    'app02': 'django3',
}
  1. 创建数据库路由规则
    在项目工程根路径下(与setting.py文件一级)创建database_router.py文件:
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'}
  """
  using="django4"
  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
  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
  def allow_migrate(self, db, app_label, model=None, **hints):
    """
    Make sure the auth app only appears in the 'auth_db'
    database.
    """
    if db in DATABASE_MAPPING.values():
      return DATABASE_MAPPING.get(app_label) == db
    elif app_label in DATABASE_MAPPING:
      return False
    return None

  1. Models创建样例
    在各自的APP中创建数据表的models时,必须要指定APP名字,如果不指定则会创建到default中配置的数据库名下,

  2. 生成数据表
    在使用django的migrate创建生成表的时候,需要加上==–database==参数,如果不加则将未指定APP的models中的表创建到default指定的数据库中,如:
    将app01下models中的表创建到django4中

python manage.py makemigrations
python manage.py migrate --database=app01

将app02下models中的表创建到django3中

python manage.py migrate --database=app02
  1. 如果想在admin后台显示数据库中的数据的话
    在每一个APP应用中的admin.py文件中加入字段
    如:app01:
admin.site.register(app01.models.Blog)
admin.site.register(app01.models.Author)
admin.site.register(app01.models.Entry)

app02:

admin.site.register(app02.models.Author)
admin.site.register(app02.models.Book,BookAdmin)
admin.site.register(app02.models.Publisher)

结果展示:

在这里插入图片描述

发布了44 篇原创文章 · 获赞 57 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45144837/article/details/104143249
今日推荐