django 多mysql数据库操作_django的多数据库的操作

红太狼 2023-01-12 05:29 216阅读 0赞

1.项目目录

在存在两个app的时候使用两个数据

58d7aa977fd9929e5b81d731f137a832.png

2.model类

app02/models.py

在使用多数据库的时候,我们要到每个表的下面使用[app_label=app的名字],示例如下

class Publish(models.Model):

name=models.CharField(max_length=32)

email=models.EmailField()

def __str__(self):

return “app02 %s” % self.name

class Meta:

#app的名字

app_label = ‘app02’

3.settings的写法

DATABASES = {

‘default’: {

‘ENGINE’: ‘django.db.backends.mysql’,

‘NAME’: ‘orm’, ## 数据库名称

‘USER’: ‘root’,

‘PASSWORD’: ‘123456’, ## 安装 mysql 数据库时,输入的 root 用户的密码

‘HOST’: ‘127.0.0.1’,

},

‘mysql02’: {

‘ENGINE’: ‘django.db.backends.mysql’,

‘NAME’: ‘orm02’, ## 数据库名称

‘USER’: ‘root’,

‘PASSWORD’: ‘123456’, ## 安装 mysql 数据库时,输入的 root 用户的密码

‘HOST’: ‘127.0.0.1’,

},

}

# 多数据库连接池

DATABASE_ROUTERS = [‘djangoser.database_router.DatabaseAppsRouter’]

# 配置app与之相对应的连接池

DATABASE_APPS_MAPPING = {

‘app01’: ‘default’,

‘app02’: ‘mysql02’,

4.在同级目录下添加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’}

“””

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

# 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

5.执行命令

python manage.py makemigrations—database指定要加载那个modles

python manage.py migrate—database=app02#这样生成的数据库前缀app02_xxx

发表评论

表情:
评论列表 (有 0 条评论,216人围观)

还没有评论,来说两句吧...

相关阅读

    相关 django 数据库配置

    在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接。 1. 修改项目的 settings 配