Django 动态切换数据库

Posted

技术标签:

【中文标题】Django 动态切换数据库【英文标题】:Django switch database dynamically 【发布时间】:2012-04-12 02:02:36 【问题描述】:

我想在用户登录时切换数据库。我已经创建了这个登录信号.. 但它不起作用

from django.dispatch import receiver
from django.contrib.auth.signals import user_logged_in
from django.db import connections

@receiver(user_logged_in)
def db_switch(sender, **kwargs):
    user_db = 'userdb_%s' % kwargs['user'].username
    cursor = connections[user_db].cursor()

数据库在settings.py 中定义。我必须使这个游标成为全球性的吗?或者这是完全错误的做法?

谢谢!

【问题讨论】:

嗯,听起来真的是 badddd 练习!为什么每个用户都应该有自己的数据库? 这是一个 SaaS 学习项目...单独的数据库是 SaaS 的一个好习惯...我找到了基于此的子域和数据库切换的示例...但我不需要那个我想根据用户切换数据库... 嗯...在我看到您的新评论之前发布了我的答案。子域是唯一的方法,因为您需要在请求开始时修改数据库,而不是在中间。我所看到的一切都表明,尝试在请求中更改全局设置是一件坏事 谢谢乔丹,该死的我真的很想在没有子域的情况下这样做...我需要 5 个用户的顶部... 我不知道有任何 SaaS 为每个用户使用单独的数据库,但都在同一个域中...... 【参考方案1】:

这是错误的做法。

老实说,我认为在 Django 中没有直接、稳定的方式来做到这一点。它不是为它设计的。

相反,我会为每个用户设置一个 settings_username.py 文件,该文件指定一个名为个人或其他东西的辅助数据库。然后,在登录后,让他们重定向到一个新域,例如 username.example.com,它使用一个独特的 .wsgi 文件来提取设置username.py 文件。

现在,就系统而言,每个网站对于该用户来说都是完全独立且独一无二的。只需确保将会话 cookie 设置为 example.com,以便他们在访问其用户网站时仍处于登录状态。

【讨论】:

嗨,我不想要域,因为我不需要它们……这就是为什么我一直在寻找一种没有子域的方法……我考虑过的其他选项是 example.com/user 但我认为这很糟糕...... 听起来可能不是 Django 的框架更适合。

以上是关于Django 动态切换数据库的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 多数据源动态切换

Jdbc多数据源动态切换项目

在 django 模板中的数据表示之间切换

多个mongoDB数据源,怎么配置动态切换

目前使用 Django “Evolution”,“South”是不是更好,值得切换?

切换到django 3并返回django 2后无法登录Django项目