【问题标题】:How to write a python application that support multiple databases [closed]如何编写支持多个数据库的python应用程序[关闭]
【发布时间】:2014-02-18 03:29:52
【问题描述】:

我正在使用python(2.7),django,和mongodb。我想创建一个支持多个数据库(monogdb,oracle,Mysql等)的应用程序。意味着如果我们在前端选择oracle,数据应该被保存在这样的oracle中。有没有办法编写那个应用程序。

【问题讨论】:

  • django 已经支持multiple databases,那么您面临的具体问题是什么?
  • @Burhan Khalid:回复坦克,是的,它支持。但是当用户选择数据库时,我需要保存特定的数据库。(如果您是所有者,您将提供多个数据库来保存用户数据),我是您网站的用户,我需要将我的数据保存在 oracle 中。然后通过单击 oracle 选项卡,我的数据将保存在 oracle 中。这是我想要的。如果你知道,请帮助我。提前致谢跨度>

标签: django oracle mongodb python-2.7 database


【解决方案1】:

Django 支持multiple databases,所以您只需要一些代码来处理它们之间的切换。

如果您已阅读文档,您会发现 Django 允许您提供自己的自定义“路由器”类,该类决定将哪个数据库用于任何给定查询:
https://docs.djangoproject.com/en/1.6/topics/db/multi-db/#using-routers

既然你说你想在“前端”选择哪个数据库,那么大概你网站的每个用户都可以选择不同的数据库后端。这带来了一个问题,因为 db 路由器对当前的 http 请求和用户一无所知。

我建议您使用此“ThreadLocal”中间件来存储当前请求对象,以便您可以从自定义路由器访问它:
https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py

假设您将用户选择的后端 in the session 保存为 request.session['db_name'] - 您的路由器将如下所示:

from django_tools.middlewares import ThreadLocal

class RequestRouter(object):
    def db_for_read(self, model, **hints):
        request = ThreadLocal.get_current_request()
        return request.session.get('db_name', 'default')

    def db_for_write(self, model, **hints):
        request = ThreadLocal.get_current_request()
        return request.session.get('db_name', 'default')

    def allow_relation(self, obj1, obj2, **hints):
        return True

    def allow_syncdb(self, db, model):
        return True

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多