如何为Django应用中的dj-stripe指定非default数据库?
问题描述
我有一个配置了三个数据库的Django应用,希望通过命令./manage.py djstripe_sync_models将每个数据库与dj-stripe同步。我的settings.py包含以下数据库配置:
DATABASES = { "default": { "ENGINE": "django.db.backends.postgresql_psycopg2", "NAME": env("DJANGO_DATABASE_NAME", default="default"), "USER": env("DJANGO_DATABASE_USER", default="postgres"), "PASSWORD": env("DJANGO_DATABASE_PASSWORD", default="***"), "HOST": env("DJANGO_DATABASE_HOST", default="localhost"), "PORT": env("DJANGO_DATABASE_PORT", default="5432"), }, "database_2": { "ENGINE": "django.db.backends.postgresql_psycopg2", "NAME": env("DJANGO_DATABASE_NAME2"), "USER": env("DJANGO_DATABASE_USER"), "PASSWORD": env("DJANGO_DATABASE_PASSWORD"), "HOST": env("DJANGO_DATABASE_HOST", default="localhost"), "PORT": env("DJANGO_DATABASE_PORT", default="5432"), }, "database_3": { "ENGINE": "django.db.backends.postgresql_psycopg2", "NAME": env("DJANGO_DATABASE_NAME3"), "USER": env("DJANGO_DATABASE_USER"), "PASSWORD": env("DJANGO_DATABASE_PASSWORD"), "HOST": env("DJANGO_DATABASE_HOST", default="localhost"), "PORT": env("DJANGO_DATABASE_PORT", default="5432"), }, }
当前该命令仅默认使用default数据库,我只能通过注释另外两个数据库并临时将目标数据库命名为default来实现同步,请问是否可以直接指定要填充的数据库?
解决方案
当然可以直接指定目标数据库,无需临时修改settings,以下是两种实用方法:
方法1:使用Django的--database参数
dj-stripe的djstripe_sync_models命令支持Django标准的--database参数,直接在命令后指定数据库别名即可分别同步:
# 同步default数据库 ./manage.py djstripe_sync_models --database=default # 同步database_2 ./manage.py djstripe_sync_models --database=database_2 # 同步database_3 ./manage.py djstripe_sync_models --database=database_3
这个参数是Django管理命令的通用参数,绝大多数第三方App的管理命令都会支持,因为它们基于Django的BaseCommand实现。
方法2:自定义命令批量同步
如果需要一次性同步所有数据库,可以编写自定义Django管理命令来批量执行:
- 在你的Django应用下创建
management/commands目录(若不存在),新建文件djstripe_sync_all_databases.py - 写入以下代码:
from django.core.management import call_command from django.conf import settings from django.core.management.base import BaseCommand class Command(BaseCommand): help = '同步dj-stripe模型到所有配置的数据库' def handle(self, *args, **options): for db_alias in settings.DATABASES.keys(): self.stdout.write(f"正在同步数据库: {db_alias}") call_command('djstripe_sync_models', database=db_alias) self.stdout.write(self.style.SUCCESS(f"{db_alias}同步完成"))
- 运行自定义命令即可批量同步所有数据库:
./manage.py djstripe_sync_all_databases
内容的提问来源于stack exchange,提问作者user3291025
相关产品推荐
相关产品推荐

