【发布时间】:2011-11-01 18:13:52
【问题描述】:
场景
我们有两个应用程序。
应用程序
TheApp 是一款深受客户喜爱的令人难以置信的应用。每个客户都有自己的 应用程序的实例,这意味着每个客户将使用不同的数据库(名称、用户、密码)。数据库连接应根据其所在的域来确定 请求进来了。
req: customerA.foo.tld -> db:(app_cust1, cust1, hunter2)
req: customerB.foo.tld -> db:(app_cust2, cust2, hunter3)
管理申请
应该能够为客户创建/删除 TheApp 实例。因此它必须设置新数据库并将配置写入somewhere。决定的方式 用于传入请求的 db 应该性能良好且易于管理。
问题
决定实例应该使用哪个数据库连接的最佳方法是什么?什么表现 最好的?什么规模最好?
我想出的答案™
我阅读了一些东西,这些是我想出的方法:
(wsgi 守护进程 + settings.py) 每个实例
每个客户都将获得自己的 settings.py 以及数据库凭据。设置 可能会从共享的设置文件中继承一些常见的东西。
对于每个新的设置文件,必须启动应用程序的新 wsgi 实例。 如果我们有很多客户,这可能会严重扩展吗?还创建 apache vhost 文件 很丑。
使用“使用”和一个 settings.py
我可以这样做
MyModel.objects.using(THE_CURRENT_DB).all()
并根据请求在某处设置THE_CURRENT_DB(中间件?)。但不得不这样做似乎很难看
到处。此外,每次客户获得他的客户时,都必须重写 settings.py/app
实例。
一个 settings.py + 应用路由器
我还没有查看是否可以访问路由器中有关请求的任何信息, 但如果是这样,我也许可以决定应该使用 settings.py 中的哪个数据库。有点儿 喜欢https://docs.djangoproject.com/en/1.3/topics/db/multi-db/#an-example,但不是每个型号 但根据要求。
修改中间件中的设置
刚刚想到也许可以在中间件中更改 db 设置。还没有 看看中间件在 Django 中是如何工作的以及那里有什么可能。
其他一些晦涩的方式
由于我对 Django 很陌生,我可能错过了一些要点,或者其中一些完全是 愚蠢和糟糕。 jes^w你会怎么做?
为什么不把所有东西都放在一个数据库里?
嗯。因为我认为东西的分离是好的。如果坏事发生,并不是每个人都会突然受到影响。
【问题讨论】:
-
修改 django 设置可能是一个坏的想法。抱歉,我无法提供更多帮助并提供好主意;)
-
顺便说一句,设置现在使用在 settings.py 中解释的环境变量,并确定客户特定的数据库和目录。它工作得很好。只需编写一个加载相关环境的 manage.py 包装器。客户的变量。我用 Fabric 做到了这一点。
标签: python django database-connection