我从一个论坛上得知Django在较低级别上添加了多数据库支持,但高级别的API尚未添加。
请问有人可以告诉我如何在Django中实现多个数据库连接。
有人知道Django何时会完全/正式支持多个数据库连接吗?
我从一个论坛上得知Django在较低级别上添加了多数据库支持,但高级别的API尚未添加。
请问有人可以告诉我如何在Django中实现多个数据库连接。
有人知道Django何时会完全/正式支持多个数据库连接吗?
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()
我最近看到的关于此事的讨论是在Proposal: user-friendly API for multi-database support django-developers线程中,该线程还提供了使用原始消息中的管理器来使用多个数据库的示例。
Eric Florenzano写了一篇非常好的博客文章,可以让您在Django中轻松支持多个数据库。
它首先创建一个新的自定义管理器,允许您指定数据库设置。
多数据库可供选择
我们总是需要一个名为"default"的数据库,其他名称由您自行决定。
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
对于查询、保存和删除操作,有一个名为 "using" 的指令。
https://docs.djangoproject.com/en/dev/topics/db/multi-db/#manually-selecting-a-database
从Django 1.2开始,它将支持多个数据库。请参见:http://docs.djangoproject.com/en/dev/topics/db/multi-db/ 版本1.2现在处于测试版
如果您的所有数据库使用相同的引擎,那么Eric Florenzano的方法效果很好。但是,如果您有不同的引擎(例如我的情况下是Postgres和MSSQL),则会在ORM代码深处遇到许多问题(例如models/sql/where.py使用默认连接的SQL语法)。
如果您需要使其工作,您应该等待Alex Gaynor的MultiDB项目,该项目计划在Django 1.2中发布。
我认为你需要采用“原始SQL”这种方式。
请看这里:http://docs.djangoproject.com/en/dev/topics/db/sql/
你需要一个到其他数据库的“连接”,
如果你查看django/db/__init__.py
大约在第39行(在我的版本中..)
connection = backend.DatabaseWrapper(**settings.DATABASE_OPTIONS)
试着从那里开始..
P.S. 我并没有真正尝试过这个或者任何东西..只是试图指出解决你问题的一般方向。