Django 多个动态数据库

2024-01-26

我一直在评估 django 并想知道以下是否可能。我已经查看了常规的多个数据库文档,因此请不要向我指出这一点,因为据我所知,尚未提及此用例。如果我错了,我收回它:)

我想要一个主数据库,其中驻留我的应用程序的大部分模型,但是其中一个应用程序需要动态创建数据库,这些将是客户特定的数据库。

数据库路径(我计划使用 sqlite)将存储在主数据库中,因此需要更改游标,但模型将保持不变。

我欢迎对实现这一目标的方法有任何想法吗?


我将以“您不应在运行时编辑设置 https://docs.djangoproject.com/en/dev/topics/settings/#altering-settings-at-runtime".

话虽如此,我也有同样的问题,我想为每个用户创建一个唯一的数据库。这样做的原因是我为用户提供了保存/访问未存储在我的服务器上的数据库的能力,这需要拥有多个数据库,因此每个用户都有一个数据库。

这个答案不是实现预期目标的推荐方法。我很想听听 django 大师如何最好地解决这个问题。然而,这是我一直在使用的解决方案,并且到目前为止效果很好。我正在使用 sqlite,但是它可以轻松地针对任何数据库进行修改。

概括来说,就是这个过程:

  1. 将新数据库添加到设置(在运行时)
  2. 创建一个文件来存储这些设置,以便在服务器重新启动时(运行时)重新加载
  3. 运行加载保存的设置文件的脚本(每当服务器重新启动时)

现在,如何实现这一目标:

1)首先,当创建新用户时,我在设置中创建一个新数据库。这段代码在我看来是创建新用户的地方。

from YOUR_PROJECT_NAME import settings
database_id = user.username #just something unique
newDatabase = {}
newDatabase["id"] = database_id
newDatabase['ENGINE'] = 'django.db.backends.sqlite3'
newDatabase['NAME'] = '/path/to/db_%s.sql' % database_id
newDatabase['USER'] = ''
newDatabase['PASSWORD'] = ''
newDatabase['HOST'] = ''
newDatabase['PORT'] = ''
settings.DATABASES[database_id] = newDatabase
save_db_settings_to_file(newDatabase) #this is for step 2)

该脚本“在运行时”将数据库设置加载到 django 项目设置中。但是,如果服务器重新启动,该数据库将不再存在于设置中。

2)为了便于在服务器重新启动时自动重新加载这些设置,我为每个数据库创建一个文件,每当服务器启动时都会加载该文件。创建该文件是由函数执行的save_db_settings_to_file:

def save_db_settings_to_file(db_settings):
    path_to_store_settings = "/path/to/your/project/YOUR_PROJECT_NAME/database_settings/"
    newDbString = """
DATABASES['%(id)s'] = {
    'ENGINE': '%(ENGINE)s', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
    'NAME': '%(NAME)s',                      # Or path to database file if using sqlite3.
    'USER': '',                      # Not used with sqlite3.
    'PASSWORD': '',                  # Not used with sqlite3.
    'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
    'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
}
    """ % db_settings
    file_to_store_settings = os.path.join(path_to_store_settings, db_settings['id'] + ".py")
    write_file(file_to_store_settings, newDbString) #psuedocode for compactness

3)为了在服务器启动时实际加载这些设置,我在最底部添加了一行/path/to/your/project/YOUR_PROJECT_NAME/settings.py,它加载设置文件夹中的每个文件并运行它,具有将数据库详细信息加载到设置中的效果。

import settings_manager

Then, import settings_manager将在以下位置加载文件/path/to/your/project/YOUR_PROJECT_NAME/settings_manager.py,其中包含以下代码:

from settings import DATABASES
import os

path_to_store_settings = "/path/to/your/project/YOUR_PROJECT_NAME/database_settings/"
for fname in os.listdir(path_to_settings):
    full_path = os.path.join(path_to_settings, fname)
    f = open(full_path)
    content = f.read()
    f.close()
    exec(content) #you'd better be sure that the file doesn't contain anything malicious

请注意,您可以将此代码直接放在 settings.py 的底部,而不是 import 语句,但使用 import 语句可以保持 settings.py 的抽象级别保持一致。

这是加载每个数据库设置的便捷方法,因为要从设置中删除数据库,您所要做的就是删除设置文件,下次服务器重新启动时,它不会将这些详细信息加载到设置中,并且数据库将无法访问。

正如我所说,这是有效的,到目前为止我已经成功使用它,但这不是理想的解决方案。如果有人可以发布更好的解决方案,我将非常感激。

它有什么不好的地方:

  • 它明确违背了 django 团队关于不要在运行时修改设置的建议。我不知道为什么给出这个建议。
  • 它使用一个exec将数据加载到设置中的语句。这应该没问题,但如果您在其中一个文件中发现一些损坏或恶意代码,您将成为一只悲伤的熊猫。

请注意,我仍然使用默认数据库来存储身份验证和会话数据,但我自己的应用程序中的所有数据都存储在用户特定的数据库中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 多个动态数据库 的相关文章

随机推荐

  • 如何有效地对Delta表进行分区?

    在将数据帧存储在增量表中时 为我的数据帧寻找有效的分区策略 我当前的数据帧 1 5000 000 rowa 将数据从数据帧移动到增量表需要 3 5 小时 为了寻找一种更有效的方法来完成此写作 我决定尝试表中的不同列作为分区列 我搜索了列的基
  • Moment js - 显示距离日期还有几天和几小时

    我正在开发一个项目 需要对日期对象进行这种文本响应 1天7小时路程 需要这样 而不是 距离 31 小时 或 距离 1 天 我也在使用 moment js 因为我正在英语和德语之间进行语言切换 所以我已经利用了 moment js 语言区域设
  • Mac 上的 Docker Beta:无法使用 ip 访问 nginx 容器

    我安装了 docker beata https beta docker com https beta docker com 对于 OSX 接下来 我用这个文件创建了一个文件夹docker compose yml web image ngin
  • ggraph/ggplot2 中的手动图例 [R]

    除了这个帖子 https stackoverflow com questions 51569831 how to draw graph corresponding with its attributes in ggraph r 在这里我提出
  • Web API Core 2.2 中的延迟加载

    我遇到了延迟加载的问题 我有以下 dbcontext public virtual DbSet
  • 如何从查询字符串中获取参数值?

    如何在routes jsx文件中定义路由来捕获 firebase request key从 Twitter 的单点登录进程在从其服务器重定向后生成的 URL 中的参数值 http localhost 8000 signin k v9ifuf
  • 在 Symfony2/Twig 中使用 JavaScript

    我有一个名为 contact html twig 的视图 它有一个带有一些文本字段的表单 我想使用 javascript 来验证没有任何字段为空 以及一些其他规则 但我不知道将 js 和定义放在哪里 我也不知道如何使用 Twig 表示法调用
  • 批处理文件:从串口接收数据并将其写入txt文件

    我正在尝试通过 USB 串行端口从 Arduino 提取一些数据并将其写入 txt 文件 因此 我使用批处理文件 Windows 7 普通cmd 它发送例如 d 从 Arduino 请求所需的数据 收到 d 后 Arduino 开始向 PC
  • 在没有窗口的情况下进行屏幕截图

    我一直在研究 Son Of Grab Apple 演示 我真的很难获得没有任何窗口 只有桌面 扩展坞和菜单栏 的屏幕截图 有谁知道该怎么做 下面是一些示例代码 仅使用桌面进行屏幕截图 CFArrayRef onScreenWindows C
  • 使用带有范围说明符而不是字节的 HTTP 范围标头?

    核心问题是关于HTTP headers的使用 包括Range http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 35 If Range http www w3 org Pr
  • Eclipse 无法启动但没有显示错误

    知道为什么我的 Eclipse 没有启动吗 The eclipse ini有以下内容 startup plugins org eclipse equinox launcher 1 1 0 v20100507 jar launcher lib
  • Django:为生产中的网站设置高效的日志系统

    好的 开发阶段已经结束 现在我的网站已上线 但是 我还没有设置日志记录 我的网站位于 var www html 目录 理想情况下 我想让 Django 登录 var log django 但这需要权限 将 Django 日志保存在 var
  • Android Chrome 浏览器不必要地重命名下载文件的名称和类型

    我想我会重新发布这个 因为我有更详细的信息 问题 Android Chrome 浏览器在所有情况下都会将文件重命名为 下载 在某些情况下 它会将类型重命名为 bin 例如 如果扩展名是 MOV 正如我之前提到的 同一 Android 设备上
  • 在pyspark中合并两个RDD

    假设我有以下 RDD a sc parallelize 1 2 5 3 b sc parallelize a c d e 如何将这 2 个 RDD 合并为一个 RDD 如下所示 a 1 c 2 d 5 e 3 Using a union b
  • 重用的 React 元素会阻止组件更新

    Foo是一个只应该渲染一次的组件 这可以用于性能优化 尽管这纯粹是理论问题 不解决任何特定的编码问题 这可以通过使用来实现shouldComponentUpdate或纯组件 这是推荐的方法 const Foo gt p Math rando
  • dask 和 pandas 数据帧中 apply 的不兼容性

    的一个样本triggers我的专栏Dask数据框看起来像下面这样 0 Total Traffic DNS UDP 1 TCP RST 2 Total Traffic 3 IP Private 4 ICMP Name triggers dty
  • 运行时出错 01 46,响应:...UNABLETOCONNECT

    通过蓝牙成功从 OBD II 模拟器获取数据到 Android 应用程序 现在我正在尝试将数据从 ELM327 设备获取到 Android 应用程序 我的汽车上连接了一个 ELM327 设备 蓝牙连接是由于 ECU 连接失败并出现无法连接错
  • 我应该将 .vscode 文件夹提交到源代码管理吗?

    Is the vscode文件夹是否要提交给源代码管理 在新项目中 该文件夹是空的 除了settings json文件 这个文件夹里会放什么东西 它是特定于机器的 特定于开发人员的吗 vs文件夹 从而不被提交 或者所有开发人员都应该共享这个
  • 确定安装的是哪个版本的 SharePoint?

    确定安装的 SharePoint 版本的最可靠方法是什么 无论是WSS还是MOSS 如果是MOSS 不管是标准的还是企业的 我想以编程方式检测安装的确切 SharePoint 版本 PS 我已经发过了SharePoint SE 上的这个问题
  • Django 多个动态数据库

    我一直在评估 django 并想知道以下是否可能 我已经查看了常规的多个数据库文档 因此请不要向我指出这一点 因为据我所知 尚未提及此用例 如果我错了 我收回它 我想要一个主数据库 其中驻留我的应用程序的大部分模型 但是其中一个应用程序需要