描述:
我有一个 Django 应用程序,当前将多个品牌的数据存储在单个数据库中。每个品牌的数据,包括用户详细信息和相关信息,都存储在该数据库中的单独表中。但是,我现在需要迁移应用程序以针对每个品牌使用单独的数据库。
当前设置:
一个数据库包含多个品牌的表。 每个品牌的用户详细信息和相关数据存储在该数据库中的单独表中。
所需设置:
每个品牌都有单独的数据库。 每个品牌的用户详细信息和相关数据存储在各自的数据库中。
使用的工具:
用于 Web 框架的 Django。 用于数据库 ORM 的 SQLAlchemy。 用于数据库迁移的 Alembic。
关键问题:
目前,我正在遵循简单的技术来连接单个数据库。
engine = create_engine(<Database URL>)
session = scoped_session(sessionmaker(bind=engine, autocommit=True))
Base.metadata.create_all(engine)
任何指导、示例或资源将不胜感激。谢谢!
在 Django 中,您可以通过修改 settings.py 文件中的 DATABASES 设置来配置多个数据库。您可以通过向 DATABASES 字典添加新的键值对来为每个品牌指定一个数据库。键将是数据库的别名,值将是包含数据库配置选项的字典。
例如:
DATABASES = {
'brand_one': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'brand_one_db',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
},
'brand_two': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'brand_two_db',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
},
# etc
}
Django 默认使用“default”数据库,但是您可以在使用 using() 方法查询模型时指定数据库。
例如:
Brand.objects.using('brand_one').all()
对于 SQLAlchemy,您将需要创建多个会话生成器,每个品牌的数据库一个。您可以将这些会话创建者存储在字典中并根据需要访问它们。
例如:
session_makers = {
'brand_one': scoped_session(sessionmaker(bind=create_engine(<brand_one_db_url>), autocommit=True)),
'brand_two': scoped_session(sessionmaker(bind=create_engine(<brand_two_db_url>), autocommit=True)),
# etc
}
然后您可以访问特定品牌的会话,如下所示:
session = session_makers['brand_one']
对于 Alembic,您将需要配置多个环境,每个环境对应一个品牌的数据库。这可以通过为每个数据库创建单独的 alembic.ini 文件并为每个数据库指定适当的 SQLAlchemy url 来完成。然后,您可以使用 -n 选项运行 alembic 命令来指定环境。
例如:
alembic -n brand_one upgrade head
为了确保在更改列或添加新列时更新所有品牌表,您可以使用公共字段创建一个基本模型,并让所有品牌模型继承此基本模型。这样,对基本模型所做的任何更改都将反映在所有品牌模型中。
关于最佳实践,请确保在迁移实际数据之前使用虚拟数据库彻底测试新设置。另外,请保留原始数据库的备份,以防出现问题。
至于潜在的陷阱,请注意,此设置可能会使数据库操作变得更加复杂,因为每次执行查询时都需要指定数据库。此外,您将需要管理多个数据库连接,这可能会导致资源使用量增加。