Django连接多个数据库

这篇具有很好参考价值的文章主要介绍了Django连接多个数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初衷

为了让不同业务的数据分离,落到不同的库,使用django连接多个数据库。

设置

# settings.py
DATABASES = {
    "default": {},
    "users": {
        "NAME": "user_data",
        "ENGINE": "django.db.backends.mysql",
        "USER": "mysql_user",
        "PASSWORD": "superS3cret",
    },
    "customers": {
        "NAME": "customer_data",
        "ENGINE": "django.db.backends.mysql",
        "USER": "mysql_cust",
        "PASSWORD": "veryPriv@ate",
    },
}
  • Django使用default数据库,如果没有其他选择
  • default可以没有,但是必须设置一个空字典

同步

设置多个数据库,需要同步多次。这里比较麻烦。

python3 manage.py
python manage.py migrate message。# 迁移到default库
python manage.py migrate message  --database=message_db

迁移将会把所有model的所有表镜像的迁移到两个库,自带的指令不要指望一次迁移所有model分表存储

Database Routing

class MessageRouter:
    """
    A router to control all database operations on models in the
    auth and contenttypes applications.
    """

    route_app_labels = { "message", "data"}
    

    def db_for_read(self, model, **hints):
        """
        Attempts to read auth and contenttypes models go to message_db.
        """


        if model._meta.app_label in self.route_app_labels:
            return "message_db"
            
            
        return None

    def db_for_write(self, model, **hints):
        """
        Attempts to write auth and contenttypes models go to message_db.
        """
        if model._meta.app_label in self.route_app_labels:

            return "message_db"
        return None

    def allow_relation(self, obj1, obj2, **hints):
        """
        Allow relations if a model in the auth or contenttypes apps is
        involved.
        """

        if (
            obj1._meta.app_label in self.route_app_labels
            or obj2._meta.app_label in self.route_app_labels
        ):
            return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        """
        Make sure the auth and contenttypes apps only appear in the
        'message_db' database.
        """
        if app_label in self.route_app_labels:

           
            return db == "message_db"
       
        return None

可以通过django的路径中间件来对数据库的读、写、迁移权限进行设置。
需要在settings.py中添加

DATABASE_ROUTERS = ["path.to.MessageRouter"]
# my instance is ["message.MessageRouter.MessageRouter"]

fake迁移

如果遇到不希望迁移到A库,但会一直提示的情况,可以使用fake迁移

py manage.py migrate  <app> --fake

总结

数据分库存储(也称为数据库分片或数据库分区)是一种将大型数据库分解为更小、更易于管理的组件(称为“分片”或“分区”)的策略。这种方法有多个潜在好处:

  1. 提高性能和响应时间
    读写分离: 通过将读操作和写操作分配到不同的数据库或分片上,可以提高系统的吞吐量和响应时间。
    并行处理: 分库允许多个查询和事务并行执行在不同的数据库或分片上,从而提高性能。
  2. 扩展性
    水平扩展: 当数据量和访问量增加时,可以通过添加更多的数据库或分片来轻松扩展系统,而不是替换现有的硬件(这称为垂直扩展)。
  3. 简化备份和恢复
    更快的备份: 小的数据库分片更容易和更快地备份。
    局部恢复: 如果一个分片出现问题,你可以只恢复那个特定的分片,而不影响整个系统。
  4. 高可用性和故障转移
    冗余: 数据可以在多个分片或数据库中进行冗余存储,从而提高数据的可用性。
    故障隔离: 如果一个数据库或分片出现问题,它不会影响到其他分片,从而减少了故障的影响范围。
  5. 数据局部性
    优化查询: 数据分片可以根据应用的访问模式来进行优化,例如,通过地理位置或时间来分片,从而提高查询性能。
  6. 管理和维护
    分布式管理: 小的、分散的数据库通常更容易管理和维护。
    版本控制和更新: 可以逐个更新或修改数据库分片,而不是一次性更新整个数据库。
  7. 成本效益
    硬件成本: 通过使用分库,你可以在廉价的 commodity 硬件上分布式地存储和处理数据,而不是依赖单一、昂贵的高性能服务器。
    尽管数据分库存储有很多好处,但它也带来了一些挑战,如数据一致性、复杂的查询和事务处理等。因此,在决定采用这种策略之前,需要仔细评估应用的需求和特点。

但是会比较麻烦,每次都要迁移两个数据库。文章来源地址https://www.toymoban.com/news/detail-670240.html

到了这里,关于Django连接多个数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django连接数据库

    mysql -u root -p show databases; 在settings.py文件中进行配置和修改 在models.py文件中进行修改 创建表 执行命令: python manage.py makemigrations python manage.py migrate 条件:在setings保证app已经注册 删除表 当需要删除表时,则再models.py中注释表结构,然后重新执行命令即可。 修改表 新增列的

    2024年04月27日
    浏览(22)
  • Django的mysql数据库连接

    首先Mysql和navicate Premuim 已经安装好,并且可以建立数据库的连接,本次需使用的工具是 1、vs code 2、navicate Premuim 3、Mysql 打开vs code ,按Ctrl+ Shift + ~ ,调出vs code的终端界面,输入以下命令创建 test11 项目  django-admin startproject test11 (1)创建虚拟环境命令: 需要跳转到项目test1

    2024年02月05日
    浏览(52)
  • django如何连接sqlite数据库?

    目录 一、SQLite数据库简介 二、Django连接SQLite数据库 1、配置数据库 2、创建数据库表 三、使用Django ORM操作SQLite数据库 1、定义模型 2、创建对象 3、查询对象 总结 本文将深入探讨如何在Django框架中连接和使用SQLite数据库。我们将介绍SQLite数据库的特点,Django的数据库配置,以

    2024年02月06日
    浏览(40)
  • django连接本地数据库并执行增删改查

    models.py文件根据数据库表映射出对应的类 在views.py中实现增删改查操作: 增: 删: 改: 查:

    2024年02月20日
    浏览(37)
  • Django后端开发——mysql数据库连接遇到的问题及解决

    stackflow帖子:https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost 报错: 数据库拒绝root用户的连接 settings.py中关于数据库的配置: 可以看到root用户的密码为123456 但是在mysql数据库里面查看用户信息,root的密码为空 这样的不匹配导致连接失败 之前尝试

    2024年02月20日
    浏览(48)
  • python+django迁移数据库成功但是数据库中还没表产生

    1、删除原来的文件(我这没了,反正就是之前执行下面两条命令生成的文件) 2、检查settings.py中DATABASES参数,首先是数据库的信息对不对。我这里是因为ENGINE=“django.db.backends.sqlite3” 因为我使用的数据库是mysql,所以修改成“django.db.backends.mysql”就好了,就这搞了一天,真

    2024年02月11日
    浏览(54)
  • Django ORM:数据库操作的Python化艺术

    Django的对象关系映射器(ORM)是其核心功能之一,允许开发者使用Python代码来定义、操作和查询数据库。这篇文章将带你深入了解Django ORM的强大之处,从基本概念到高级查询技巧,提供丰富的示例帮助你掌握使用Django ORM进行有效和高效的数据库操作。 Django ORM的目的是提供一

    2024年02月04日
    浏览(49)
  • python#django数据库一对一/一对多/多对多

    搭建 # 一对一 class   TestUser(models.Model):     username=models.CharField(max_length=32)     password = models.CharField(max_length=32) class TestInfo(models.Model):     mick_name=models.CharField(max_length=32)     user=models.OneToOneField(to=TestUser,on_delete=models.CASCADE()#on_delete 删除的模式 CASCADE 级联删除 让后执行数

    2024年02月14日
    浏览(62)
  • python+django+mysql项目实践二(前端及数据库)

    Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 添加模板 在templates下创建 views文件中添加 在setting文件中进行配置 在Terminal输入命令下发指令

    2024年02月14日
    浏览(45)
  • 二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)

     大家好,我是csdn的博主: lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主 lqj_本人擅长微信小程序,前端,python,等方面的知识 https://blog.csdn.net/lbcyllqj?spm=1011.2415.3001.5343 哔哩哔哩欢迎关注: 小淼Develop 小淼Develop的个人空间-小淼Develop个

    2024年02月03日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包