Django 同时连接mysql 和sqlite3 数据库操作

一个数据库对一个app

setting.py 配置文件

DATABASES = {
"default": {
    "ENGINE": "django.db.backends.sqlite3",
    "NAME": os.path.join(BASE_DIR, "db.sqlite3"),
},
"db1": {
    "ENGINE": "django.db.backends.mysql",
    "NAME": "django_advanced",
    "HOST": "127.0.0.1",
    "PORT": "3306",
    "USER": "root",
    "PASSWORD": "root",
}

配置数据库路由 setting.py

DATABASES_APPS_MAPPING = {
    "polls": "default",
    "polls2": "db1",
}

DATABASE_ROUTERS = ["my_blog.database_app_router.DatabaseAppsRouter"]
# my_blog 路由文件目录

编写路由文件 database_app_router.py

from django.conf import settings


class DatabaseAppsRouter(object):
    def db_for_read(self, model, **hints):
        app_label = model._meta.app_label
        if app_label in settings.DATABASES_APPS_MAPPING:
            res = settings.DATABASES_APPS_MAPPING[app_label]
            print(res)
            return res
        return None

    def db_for_write(self, model, **hints):
        app_label = model._meta.app_label
        if app_label in settings.DATABASES_APPS_MAPPING:
            return settings.DATABASES_APPS_MAPPING[app_label]
        return None

    def allow_relation(self, obj1, obj2, **hints):
        # 获取对应数据库的名字
        db_obj1 = settings.DATABASES_APPS_MAPPING.get(obj1._mata.app_label)
        db_obj2 = settings.DATABASES_APPS_MAPPING.get(obj2._mata.app_label)
        if db_obj1 and db_obj2:
            if db_obj1 == db_obj2:
                return True
            else:
                return False
        return None

    def db_for_migrate(self, db, app_label, model_name=None, **hints):
        if db in settings.DATABASES_APPS_MAPPING.values():
            return settings.DATABASES_APPS_MAPPING.get(app_label) == db
        elif app_label in settings.DATABASES_APPS_MAPPING:
            return False
        return None

新建app python manage.py startapp polls2

注册setting

INSTALLED_APPS = [
    "polls2",
]

添加模版OK

同一个app下使用不同的数据库

上面配置是一样的

models.py 编写

class Book2(models.Model):
    author = models.CharField(max_length=1024, blank=True, null=True)
    title = models.CharField(max_length=1024)

    class Meta:
        app_label = "polls2"  # app_label 指定数据库
        db_table = "week_company_data"  # db_table 指定表名
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • PythonWeb框架要点、Django介绍、工程搭建、配置、静态文件与路由 1.Python Web 框架要点 ...
    Cestine阅读 1,995评论 0 6
  • Django的来历:python开发的! long long long years ago!劳伦斯出版集团新闻 网...
    JAguys阅读 531评论 0 0
  • Django 准备 “虚拟环境为什么需要虚拟环境:到目前位置,我们所有的第三方包安装都是直接通过 pip inst...
    33jubi阅读 1,401评论 0 5
  • 一、Django基础 Django 是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的...
    BerL1n阅读 6,364评论 0 10
  • 已经同步到gitbook,想阅读的请转到gitbook: Django 1.10 中文文档 This tutori...
    leyu阅读 2,940评论 3 13

友情链接更多精彩内容