当前位置: 首页 > 工具软件 > migrate-mongo > 使用案例 >

Django连接多数据库配置(mysql、mongo)

宗政小林
2023-12-01

MYSQL

setting配置如下

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "pay",
        "USER": "root",
        "PASSWORD": "123456",
        "HOST": "10.23.xxx.xx",
        "PORT": 3306,
    },
    "ebox": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "ebox",
        "USER": "root",
        "PASSWORD": "123456",
        "HOST": "10.23.xxx.xx",
        "PORT": 3306,
        'OPTIONS': {'charset': 'utf8mb4'},
    }
}

DATABASE_ROUTERS = ['customer_admin_api.db_router.AuthRouter', ]

db_router.AuthRouter如下

class AuthRouter:
    def db_for_read(self, model, **hits):
        db = model.db_name()
        return db

    def db_for_write(self, model, **hits):
        try:
            db = model.db_name()
        except:
            db = "default"
        return db

    def allow_relation(self, obj1, obj2, **hits):
        try:
            db1 = obj1.db_name()
        except:
            db1 = "default"
        try:
            db2 = obj2.db_name()
        except:
            db2 = "default"
        if db1 == db2:
            return True
        else:
            return False

    def allow_migrate(self, db, app_label, model_name=None, **hits):
        return True

models如下

class TerminalUserLogs(models.Model):
    terminal_id = models.IntegerField()
    terminal_code = models.CharField(max_length=255)
    user_id = models.IntegerField()
    username = models.CharField(max_length=255)
    action = models.CharField(max_length=255)
    params = models.CharField(max_length=255)
    remark = models.CharField(max_length=255)
    created_at = models.DateTimeField()

    @classmethod
    def db_name(cls):
        return 'ebox'

    class Meta:
        managed = False
        db_table = "terminal_user_logs"
        verbose_name = "用户柜机操作日志表"

MONGO

setting配置如下

from mongoengine import connect
connect('sms', host='10.23.xxx.xx', port=27017, alias='sms')
connect('user', host='10.23.xxx.xx', port=27017, alias='user')

其中第一个参数为要连接的数据库名称,host和port不过多解释,alias为多mongo库配置的别名

models表中配置如下

from mongoengine import Document, QuerySet as mongo_queryset
from mongoengine import fields as mongo_fields

class UserManager(mongo_queryset):
    def get_user_by_id(self, uid):
        return self.filter(_id=uid).as_pymongo()
        
class User(Document):
    """
        mongo用户表
    """
    _id = mongo_fields.ObjectIdField()
    username = mongo_fields.StringField()
    status = mongo_fields.IntField()
    introduction = mongo_fields.StringField()
    gender = mongo_fields.IntField()
    nickname = mongo_fields.StringField()
    avatar = mongo_fields.StringField()
    crts = mongo_fields.IntField()
    upts = mongo_fields.IntField()

    meta = {'db_alias': 'user', "collection": "user", 'queryset_class': UserManager}

其中db_alias对应setting中alias定义的mongo别名,collection为选择的集合,queryset_class可以自定义模型管理器

 类似资料: