欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-17 19:51:34
...

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)

结果展示:

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