Django多数据库迁移实现咨询:多模型分库存储配置方案
嘿,我刚好在Django 2.x环境下处理过类似的多模型分库迁移场景,结合你的配置(Python 3.6、PostgreSQL可选),给你梳理下完整的操作步骤:
1. 先确认数据库配置(settings.py)
首先要在项目的settings.py里配置好所有需要用到的数据库,比如你提到的default和mydb02:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', # 也可替换为sqlite3/mysql,按需选择 'NAME': 'your_default_db_name', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '5432', }, 'mydb02': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydb02_db_name', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '5432', } }
2. 配置数据库路由(关键!)
因为你通过模型的Meta.database指定了存储库,需要让Django知道如何把模型和对应的数据库绑定。创建一个router.py文件放在项目根目录下:
class DatabaseRouter: # 读取数据时,使用模型Meta指定的数据库,默认用default def db_for_read(self, model, **hints): return getattr(model._meta, 'database', 'default') # 写入数据时同理 def db_for_write(self, model, **hints): return getattr(model._meta, 'database', 'default') # 控制迁移:只允许模型在自己指定的数据库上执行迁移 def allow_migrate(self, db, app_label, model_name=None, **hints): model = hints.get('model') if model: # 匹配模型指定的数据库和当前要迁移的数据库 return getattr(model._meta, 'database', 'default') == db return None
然后在settings.py里添加路由配置(替换your_project_name为你实际的项目名称):
DATABASE_ROUTERS = ['your_project_name.router.DatabaseRouter']
3. 生成迁移文件
和常规操作一样,先生成所有模型的迁移文件,Django会自动识别每个模型的数据库归属:
python manage.py makemigrations
这一步会在每个包含模型的app的migrations目录下生成对应的迁移文件,不需要手动拆分。
4. 针对每个数据库应用迁移
因为Django默认只会处理default数据库,所以需要分别给每个数据库执行迁移:
- 迁移默认数据库:
python manage.py migrate --database=default
- 迁移
mydb02数据库:
python manage.py migrate --database=mydb02
执行后,MyModel02会被创建在mydb02中,MyModel01和MyModel03(未指定database)则会被创建在default数据库里。
额外注意事项
- 如果某个app下的模型分属不同数据库,
migrate --database=xxx会自动通过路由筛选出属于该数据库的模型,无需手动修改迁移文件。 - 可以用
python manage.py inspectdb --database=mydb02命令查看mydb02中的表结构,验证迁移是否成功。 - 确保你添加
models.options.DEFAULT_NAMES += ('database',)的代码在模型加载前执行(比如放在项目的__init__.py或者app的models.py开头),避免Django忽略Meta.database字段。
内容的提问来源于stack exchange,提问作者baldr
相关产品推荐
相关产品推荐

