Django多数据库连接配置以及使用
程序员文章站
2024-03-17 19:51:34
...
Django多数据库连接配置
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。下面给大家详细步骤
- 修改项目的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'),
},
-
设置数据库的路由规则方法
也在 settings.py 中配置 DATABASE_ROUTERS
DATABASE_ROUTERS = [‘project_name.database_router.DatabaseAppsRouter’]
这里要注意:project_name 要改成你自己的工程名 -
设置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',
}
-
创建数据库路由规则
在项目工程根路径下(与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
-
Models创建样例
在各自的APP中创建数据表的models时,必须要指定APP名字,如果不指定则会创建到default中配置的数据库名下, -
生成数据表
在使用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
- 如果想在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)
结果展示:
上一篇: mysql存储过程和使用场景
推荐阅读
-
Django多数据库连接配置以及使用
-
IDEA使用properties配置文件进行mysql数据库连接的教程图解
-
IDEA使用properties配置文件进行mysql数据库连接的教程图解
-
CodeIgniter针对数据库的连接、配置及使用方法,codeigniter数据库_PHP教程
-
Django Web开发中django-debug-toolbar的配置以及使用
-
Java语言使用JDBC连接Mysql数据库的详细步骤,以及详细解释
-
【SQLServer】使用T-SQL访问远程数据库:openrowset 和 openquery 以及连接服务器的创建
-
CodeIgniter针对数据库的连接、配置及使用方法,codeigniter数据库
-
使用ACCESS数据库,连接字符串的配置
-
Django连接Oracle数据库配置