2008-11-06 92 views
9

从一些论坛我知道多个数据库支持在Django的较低级别添加,但更高级别的apis尚未添加。django中的多个数据库支持

任何人都可以请告诉我如何可以在Django中实现多个数据库连接。

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

回答

0

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

你需要一个“连接”到其他数据库, 如果你看看周围django/db/__init__.py第39行(在我的版本。)

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

尝试从那里..
PS我没有真正尝试过这个或其他什么,只是试图指出我认为可能解决您的问题的一般方向。

3

如果你读了几许多(许多)关于这个问题在Django-dev的线程,你会看到什么看起来简单,是不是。如果你选择一个用例,那么它看起来很简单,但是一旦你开始总结任何方式,你就会遇到麻烦。

要使用上述引用的线程作为示例,当您说“多个数据库”时,您在谈论以下哪一项?

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

,你将需要:

整个数据块
  • 外键
  • JOIN的跨机器和/或发动机
  • 等等,等等

一个问题用一个漂亮的ORM就像Django一样,它在一个不错的绘画工作下隐藏了所有这些混乱的细节。要继续做到这一点,但要添加上述任何一项,并不容易(tm)。

+0

我不明白,这确实是一个复杂的工作。 但是,然后django可能只能用于简单的Web应用程序,一旦应用程序变大,它就成为分割数据在多个数据库服务器(分片)中的强制性。开发者如何处理这种情况? – codebreak 2008-11-08 05:31:14

+0

在所有多个数据库问题中,分片可能是特定应用程序中最具特色的,因此最难以产生一个通用解决方案。你知道任何有这个问题的通用解决方案的ORM吗? – 2008-11-08 20:39:44

2

Eric Florenzano写了一篇非常好的博客文章,允许您在多个数据库支持:Easy MultipleDatabase Support for Django

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

+0

根据Eric的示例修改全局设置对象并不是一个线程安全的事情。它看起来可能是下层连接API已经改变,以允许传入设置,这将使它线程安全。 – 2009-08-27 20:16:50

0

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

如果您需要这个工作,你应该等待其计划在Django 1.2

9

如果你只是需要多连接亚历克斯Gaynor的MultiDB项目,你可以做这样的事情:

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() 
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