最近在研究微服务和分布式,设计到了数据库分库,记录一下

首先,创建多个数据库,如果是已经生成的数据库,可以分库,这里我是新创建的项目,刚好可以用来尝试

我是用docker创建的mysql数据库容器

拉取docker镜像:

docker pull mysql:5.7

创建容器:

docker run --name=mysql5.7 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

创建多个mysql容器之后,django配置好相应数据库,我这里分成了三个数据库,一个是默认,放django的user,group,permission,session之类的,另外一个是order和sale两个app的,这里我打算下一步微服务的时候再拆开,这里先记录分库的事情,数据库代码如下:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'HOST': '192.168.1.112',
  5. 'PORT': '13308',
  6. 'NAME': 'default',
  7. 'USER': 'root',
  8. 'PASSWORD': '0123456789',
  9. 'TEST': {
  10. 'MIRROR': 'default'
  11. }
  12. },
  13. 'sale': {
  14. 'ENGINE': 'django.db.backends.mysql',
  15. 'HOST': '192.168.1.112',
  16. 'PORT': '13306',
  17. 'NAME': 'sale',
  18. 'USER': 'root',
  19. 'PASSWORD': '0123456789',
  20. 'TEST': {
  21. 'MIRROR': 'default'
  22. }
  23. },
  24. 'order': {
  25. 'ENGINE': 'django.db.backends.mysql',
  26. 'HOST': '192.168.1.112',
  27. 'PORT': '13307',
  28. 'NAME': 'order',
  29. 'USER': 'root',
  30. 'PASSWORD': '0123456789',
  31. 'TEST': {
  32. 'MIRROR': 'default'
  33. }
  34. }
  35. }

分库之后,在settings.py同级目录下,创建一个databaserouter

  1. DATABASE_MAPPING = {
  2. # example:
  3. # 'app_name':'database_name',
  4. 'sale': 'sale',
  5. 'order': 'order',
  6. 'admin': 'default',
  7. 'auth': 'default',
  8. 'contenttypes': 'default',
  9. 'sessions': 'default',
  10. }
  11. class DBAppsRouter(object):
  12. def db_for_read(self, model, **hints):
  13. """"Point all read operations to the specific database."""
  14. if model._meta.app_label in DATABASE_MAPPING:
  15. return DATABASE_MAPPING[model._meta.app_label]
  16. return None
  17. def db_for_write(self, model, **hints):
  18. """Point all write operations to the specific database."""
  19. if model._meta.app_label in DATABASE_MAPPING:
  20. return DATABASE_MAPPING[model._meta.app_label]
  21. return None
  22. def allow_relation(self, obj1, obj2, **hints):
  23. """Allow any relation between apps that use the same database."""
  24. db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
  25. db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
  26. if db_obj1 and db_obj2:
  27. if db_obj1 == db_obj2:
  28. return True
  29. else:
  30. return False
  31. return None
  32. def allow_syncdb(self, db, model):
  33. """Make sure that apps only appear in the related database."""
  34. if db in DATABASE_MAPPING.values():
  35. return DATABASE_MAPPING.get(model._meta.app_label) == db
  36. elif model._meta.app_label in DATABASE_MAPPING:
  37. return False
  38. return None
  39. def allow_migrate(self, db, app_label, model=None, **hints):
  40. """
  41. Make sure the auth app only appears in the 'auth_db'
  42. database.
  43. """
  44. if db in DATABASE_MAPPING.values():
  45. return DATABASE_MAPPING.get(app_label) == db
  46. elif app_label in DATABASE_MAPPING:
  47. return False
  48. return None

这里一定要把DATABASE_MAPPING里面的app名字和app名字对应,不然会读写不到,具体可以看上述代码,然后在模型类后面给每个模型添加一个app_label:

  1. class Meta:
  2. app_label = 'order'

最后就是migrate数据库了,先makemigrations order,然后migrate --database order

后面sale app一样

django数据库分库migrate的更多相关文章

  1. Django 实现分库

    网站后端的数据库随着业务的不断扩大,用户的累积,数据库的压力会逐渐增大.一种办法是优化使用方法,也就是的优化 SQL 语句啦,添加缓存以达到减少存取的目的:另外一种办法是修改使用架构,在数据库层面上「 ...

  2. django数据库读写分离

    django数据库读写分离 1. 配置数据库 settings.py文件中 用SQLite: DATABASES = { 'default': { 'ENGINE': 'django.db.backe ...

  3. Python之路【第十九章】:Django 数据库对象关系映射

    Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...

  4. 第二十章 Django数据库实战

    第二十章 Django数据库实战 第一课 获取单表单数据的三种方式: urls.py中的路由代码: path('busniess',views.busniess), views.py中代码: def ...

  5. Django 数据库查询集合(双下划线连表操作)

    Django是一款优秀的web框架,有着自己的ORM数据库模型.在项目中一直使用django数据库,写一篇文章专门记录一下数据库操作.略写django工程创建过程,详写查询过程.可以和sqlalche ...

  6. 5.Django数据库配置

    Django默认支持sqlite.mysql.oracle.postgresql数据库,像db2和sqlserver需要安装第三方的支持 配置Django数据库:\hello_django\hello ...

  7. 记Django数据库迁移过程中遇到的一些问题

    首先描述一下问题,Django 数据库使用的mysql, 然后开始没注意,没建一个default库,就把第一个数据库当成默认的了,结果Django的admin相关的那些表,都自动生成到这个库里了,现在 ...

  8. Django 数据库查询集合(多对多)

    Django 数据库查询集合(双下划线连表操作) 目录: 1.Django环境搭建 2.数据库建表 3.写入数据 4.查询语句 Django环境搭建 1.安装django pip install dj ...

  9. 数据库分库分表(sharding)系列(一) 拆分规则

    第一部分:实施策略 数据库分库分表(sharding)实施策略图解 1. 垂直切分垂直切分的依据原则是:将业务紧密,表间关联密切的表划分在一起,例如同一模块的表.结合已经准备好的数据库ER图或领域模型 ...

随机推荐

  1. 清除无用工具栏:CommandbarCleaner下载

    下面演示的工具,适用于Office任一版本. 使用本工具之前,预先打开相应的Office软件. 下载: CommandbarCleaner.rar

  2. 使用Cron表达式创建定时任务

    CronTriggerCronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用.CroTr ...

  3. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-mock(8)

    mock, 较7属于代码优化 # -*- coding: utf-8 -*- # @Time : 2020/2/12 8:40 # @File : learn_mock_8.py # @Author: ...

  4. jmeter常用定时器以及事物控制器

    定时器(并发):Synchronizing Timer 事物控制器: 勾选Generate parent sample当单看主要数据和页面数据性能测试结果还是有比较大的差异的,因而在进行页面性能测试的 ...

  5. win10安装inventor失败,怎么强力卸载删除注册表并重新安装

    一些搞设计的朋友在win10系统下安装inventor失败或提示已安装,也有时候想重新安装inventor的时候会出现本电脑windows系统已安装inventor,你要是不留意直接安装invento ...

  6. ZOJ-1163-The Staircases

    dp[i][j]表示i个砖头构成的最高台阶不高于j的楼梯数目 Accepted 1163 C++11 0 2280 #include "bits/stdc++.h" using n ...

  7. POJ 3678 2-SAT

    题意:有n个顶点里面可以放数字1或0,给m个限制,每个限制给出两个顶点编号和两编号内数字运算后的结果 思路:很直接的2-SAT,每个点分为1和0两种情况,按限制要求建边,跑tarjan然后判断点是否在 ...

  8. 由生到死10个月!做App中的“二”有多难

    十月,原本是怀胎过程的喜悦时光,但这段个时光,如今却是绝大多数App从生到死的所有时间.在App市场表面形式一片大好,彻底主宰我们生活.工作.娱乐的当下,绝大多数用户只是在App海洋中只取一瓢饮,其他 ...

  9. js中判断为false的情况

     document.write((new Boolean())+"<br />");        document.write((new Boolean(" ...

  10. [PyTorch入门]之数据导入与处理

    数据导入与处理 来自这里. 在解决任何机器学习问题时,都需要在处理数据上花费大量的努力.PyTorch提供了很多工具来简化数据加载,希望使代码更具可读性.在本教程中,我们将学习如何从繁琐的数据中加载. ...