如何通过 Django 和 SQLAlchemy 使用多个数据库

问题描述 投票:0回答:1

描述

我有一个 Django 应用程序,当前将多个品牌的数据存储在单个数据库中。每个品牌的数据,包括用户详细信息和相关信息,都存储在该数据库中的单独表中。但是,我现在需要迁移应用程序以针对每个品牌使用单独的数据库。

当前设置:

一个数据库包含多个品牌的表。 每个品牌的用户详细信息和相关数据存储在该数据库中的单独表中。

所需设置

每个品牌都有单独的数据库。 每个品牌的用户详细信息和相关数据存储在各自的数据库中。

使用的工具

用于 Web 框架的 Django。 用于数据库 ORM 的 SQLAlchemy。 用于数据库迁移的 Alembic。

关键问题

  1. 如何配置 Django 为每个品牌使用单独的数据库?
  2. 我需要对 SQLAlchemy 模型进行哪些更改才能支持这种新的数据库结构?
  3. 我应该如何使用 Alembic 处理数据库迁移以确保无缝过渡到新设置?
  4. 在此迁移过程中我应该注意哪些最佳实践或潜在陷阱?
  5. 到目前为止,我将不同品牌的用户信息存储在一张表中。现在,我需要分离每个品牌的数据库,但所有品牌的表架构将保持相同。因此,如果我更改列或向任何品牌数据库表添加新列,如何确保该列也在所有品牌数据库表中得到更新?

目前,我正在遵循简单的技术来连接单个数据库。

engine = create_engine(<Database URL>)
session = scoped_session(sessionmaker(bind=engine, autocommit=True))
Base.metadata.create_all(engine)

任何指导、示例或资源将不胜感激。谢谢!

django database sqlalchemy alembic multiple-databases
1个回答
0
投票

在 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

为了确保在更改列或添加新列时更新所有品牌表,您可以使用公共字段创建一个基本模型,并让所有品牌模型继承此基本模型。这样,对基本模型所做的任何更改都将反映在所有品牌模型中。

关于最佳实践,请确保在迁移实际数据之前使用虚拟数据库彻底测试新设置。另外,请保留原始数据库的备份,以防出现问题。

至于潜在的陷阱,请注意,此设置可能会使数据库操作变得更加复杂,因为每次执行查询时都需要指定数据库。此外,您将需要管理多个数据库连接,这可能会导致资源使用量增加。

© www.soinside.com 2019 - 2024. All rights reserved.