【问题标题】:Multiple database support in djangodjango 中的多数据库支持
【发布时间】:2010-09-21 01:14:22
【问题描述】:

从某个论坛我了解到,在 Django 中,底层添加了多数据库支持,但尚未添加更高级别的 api。

谁能告诉我如何在 Django 中实现多个数据库连接。

有没有人知道 Django 何时会完全/正式支持多个数据库连接。

【问题讨论】:

    标签: python django database-connection


    【解决方案1】:

    多个数据库可供选择

    我们总是需要一个命名的默认值,其余的名称由您决定。

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mupltiple_datab_app1',                     
            'USER': 'root',                     
            'PASSWORD': 'admin',                  
            'HOST': "",                      
            'PORT': "",                     
        },
        'user1':{
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'mupltiple_datab_app2',                      
            'USER': 'root',                     
            'PASSWORD': 'admin',                  
            'HOST': "",                        
            'PORT': "",  
    
        },
        'user2':{
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'mupltiple_datab_app3',                      
            'USER': 'root',                     
            'PASSWORD': 'admin',                  
            'HOST':"" ,                     
            'PORT': "" ,  
    
        }
    }
    

    同步到一个特定的数据库

    manage.py syncdb --database=user1
    

    【讨论】:

      【解决方案2】:

      有一个用于查询、保存和删除的“使用”指令

      https://docs.djangoproject.com/en/dev/topics/db/multi-db/#manually-selecting-a-database

      【讨论】:

        【解决方案3】:

        从 Django 1.2 开始,它将支持多个数据库。见:http://docs.djangoproject.com/en/dev/topics/db/multi-db/ 1.2 版现在处于测试阶段

        【讨论】:

          【解决方案4】:

          【讨论】:

            【解决方案5】:

            如果你只是需要多个连接,你可以这样做:

            from django.db import load_backend
            myBackend = load_backend('postgresql_psycopg2') # or 'mysql', 'sqlite3', 'oracle'
            myConnection = myBackend.DatabaseWrapper({
                'DATABASE_HOST': '192.168.1.1',
                'DATABASE_NAME': 'my_database',
                'DATABASE_OPTIONS': {},
                'DATABASE_PASSWORD': "",
                'DATABASE_PORT': "",
                'DATABASE_USER': "my_user",
                'TIME_ZONE': "America/New_York",})
            # Now we can do all the standard raw sql stuff with myConnection.
            myCursor = myConnection.cursor()
            myCursor.execute("SELECT COUNT(1) FROM my_table;")
            myCursor.fetchone()
            

            【讨论】:

            • 赞成,因为这正是我在 Google 上找到此答案时所寻找的内容
            【解决方案6】:

            如果您的所有数据库都使用相同的引擎,那么 Eric Florenzano 的方法会很有效。如果你有不同的引擎(在我的例子中是 Postgres 和 MSSQL),你会在 ORM 代码中遇到很多问题(例如使用默认连接的 SQL 语法的 models/sql/where.py)。

            如果你需要这个工作,你应该等待 Alex Gaynor 为 Django 1.2 计划的 MultiDB 项目

            【讨论】:

              【解决方案7】:

              Eric Florenzano 写了一篇非常好的博文,让您可以在以下位置获得多数据库支持:Easy MultipleDatabase Support for Django

              首先创建一个允许您指定数据库设置的新自定义管理器。

              【讨论】:

              • 按照 Eric 的示例修改全局设置对象不是线程安全的事情。看起来可能较低级别的连接 API 已更改为允许传入设置,这将使其成为线程安全的。
              【解决方案8】:

              如果您在 django-dev 中阅读了有关此主题的许多 (许多) 线程,您会发现 看起来 简单明了,但实际上并非如此。如果您选择一个用例,那么看起来很容易,但是一旦您开始以任何方式进行概括,您就会遇到麻烦。

              以上面引用的线程为例,当你说“多个数据库”时,你指的是以下哪个?

              • 同一台机器上同一引擎下的所有数据库。
              • 同一台机器上的所有数据库,不同的引擎(例如 MySQL + PostgreSQL)
              • 一个主数据库,在不同的机器上有 N 个只读从属。
              • 跨多个数据库服务器的表分片。

              你需要:

              • 跨数据库的外键
              • 跨机器和/或引擎的联接
              • 等。等

              像 Django 这样的光滑 ORM 的一个问题是,它在漂亮的油漆工作下隐藏了所有这些杂乱的细节。继续这样做,但随后添加任何上述内容,并不容易(tm)。

              【讨论】:

              • 我明白这确实是一项复杂的工作。但是 django 可能只用于简单的 web 应用程序,一旦应用程序变大,就必须在多个数据库服务器中拆分数据(分片)。开发人员如何处理此类情况?
              • 在所有多个数据库问题中,分片可能是最特定于应用程序的,因此最难提供通用解决方案。你知道任何 ORM 对这个问题有一个通用的解决方案吗?
              【解决方案9】:

              我认为您将不得不求助于“原始 sql”.. 有点东西..
              看这里:http://docs.djangoproject.com/en/dev/topics/db/sql/

              您需要与其他数据库的“连接”, 如果您在第 39 行附近查看django/db/__init__.py(在我的版本中..)

              connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)

              尝试从那里拿走它..
              附言我还没有真正尝试过这个或任何东西......只是试图指出我认为可能会解决你的问题的大致方向。

              【讨论】:

                【解决方案10】:

                我在Proposal: user-friendly API for multi-database support django-developers 线程中看到的最新讨论,在原始消息中还提供了使用管理器使用多个数据库的一种方法的示例。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-06-07
                  • 2014-02-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-11-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多