mirror of
https://github.com/django/django.git
synced 2025-07-04 09:49:12 +00:00
[multi-db] Added first, incomplete draft of multiple db doc.
git-svn-id: http://code.djangoproject.com/svn/django/branches/multiple-db-support@3513 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
7062c656c3
commit
08c4207182
163
docs/multiple_database_support.txt
Normal file
163
docs/multiple_database_support.txt
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
========================
|
||||||
|
Using Multiple Databases
|
||||||
|
========================
|
||||||
|
|
||||||
|
Standard Django practice is to use a single database connection for
|
||||||
|
all models in all applications. However, Django supports configuring
|
||||||
|
and using multiple database connections on a per-application, per-model
|
||||||
|
or an ad-hoc basis. Using multiple database connections is optional.
|
||||||
|
|
||||||
|
Configuring other database connections
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Django's default database connection is configured via the settings
|
||||||
|
DATABASE_ENGINE, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD,
|
||||||
|
DATABASE_HOST, and DATABASE_PORT. Other connections are configured via
|
||||||
|
the OTHER_DATABASES setting. Define OTHER_DATABASES as a dict, with a
|
||||||
|
name for each connection as the key and a dict of settings as the
|
||||||
|
value. In each OTHER_DATABASES entry (called a "named connection"),
|
||||||
|
the keys are the same as the DATABASE_ENGINE, etc, settings used to
|
||||||
|
configure the default connection. All keys are optional; any that are
|
||||||
|
missing in a named connection's settings will inherit their values
|
||||||
|
from the default connection.
|
||||||
|
|
||||||
|
Here's an example::
|
||||||
|
|
||||||
|
DATABASE_ENGINE = 'postgresql'
|
||||||
|
DATABASE_NAME = 'django_apps'
|
||||||
|
DATABASE_USER = 'default_user'
|
||||||
|
DATABASE_PASSWORD = 'xxx'
|
||||||
|
|
||||||
|
OTHER_DATABASES = {
|
||||||
|
'local': { 'DATABASE_ENGINE': 'sqlite3',
|
||||||
|
'DATABASE_NAME': '/tmp/cache.db' },
|
||||||
|
'public': { 'DATABASE_HOST': 'public',
|
||||||
|
'DATABASE_USER': 'public_user',
|
||||||
|
'DATABASE_PASSWORD': 'xxx' }
|
||||||
|
'private': { 'DATABASE_HOST': 'private',
|
||||||
|
'DATABASE_USER': 'private_user',
|
||||||
|
'DATABASE_PASSWORD': 'xxx' }
|
||||||
|
}
|
||||||
|
|
||||||
|
In addition to the DATABASE_* settings, each named connection in
|
||||||
|
OTHER_DATABASES may optionally include a MODELS setting. This should
|
||||||
|
be a list of app or app.model names, and is used to configure which
|
||||||
|
models should use this connection instead of the default connection.
|
||||||
|
|
||||||
|
Here's the example above, with ``MODELS``::
|
||||||
|
|
||||||
|
OTHER_DATABASES = {
|
||||||
|
'local': { 'DATABASE_ENGINE': 'sqlite3',
|
||||||
|
'DATABASE_NAME': '/tmp/cache.db',
|
||||||
|
# A model name: only the model ContentItem
|
||||||
|
# with the app_label myapp will use this connection
|
||||||
|
'MODELS': ['myapp.ContentItem'] },
|
||||||
|
'public': { 'DATABASE_HOST': 'public',
|
||||||
|
'DATABASE_USER': 'public_user',
|
||||||
|
'DATABASE_PASSWORD': 'xxx',
|
||||||
|
# Two models in myapp will use the connection
|
||||||
|
# named 'public', as will ALL models in
|
||||||
|
# django.contribe.comments
|
||||||
|
'MODELS': ['myapp.Blog','myapp.Article',
|
||||||
|
'django.contrib.comments' ] }
|
||||||
|
# No models or apps are configured to use the private db
|
||||||
|
'private': { 'DATABASE_HOST': 'private',
|
||||||
|
'DATABASE_USER': 'private_user',
|
||||||
|
'DATABASE_PASSWORD': 'xxx' }
|
||||||
|
}
|
||||||
|
|
||||||
|
Accessing a model's connection
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Each manager has a db attribute that can be used to access the model's
|
||||||
|
connection. Access the db attribute of a model's manager to obtain the
|
||||||
|
model's currently configured connection.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class Blog(models.Model)
|
||||||
|
name = models.CharField(maxlength=50)
|
||||||
|
|
||||||
|
class Article(models.Model)
|
||||||
|
blog = models.ForeignKey(Blog)
|
||||||
|
title = models.CharField(maxlength=100)
|
||||||
|
slug = models.SlugField()
|
||||||
|
summary = models.CharField(maxlength=500)
|
||||||
|
body = models.TextField()
|
||||||
|
|
||||||
|
class ContentItem(models.Model)
|
||||||
|
slug = models.SlugField()
|
||||||
|
mimetype = models.CharField(maxlength=50)
|
||||||
|
file = models.FileField()
|
||||||
|
|
||||||
|
# Get a ConnectionInfo instance that describes the connection
|
||||||
|
article_db = Article.objects.db
|
||||||
|
|
||||||
|
# Get a connection and a cursor
|
||||||
|
connection = article_db.connection
|
||||||
|
cursor = connection.cursor()
|
||||||
|
|
||||||
|
# Get the ``quote_name`` function from the backend
|
||||||
|
qn = article_db.backend.quote_name
|
||||||
|
|
||||||
|
Ordinarily you won't have to access a model's connection directly;
|
||||||
|
just use the model and manager normally and they will use the
|
||||||
|
connection configured for the model.
|
||||||
|
|
||||||
|
ConnectionInfo objects
|
||||||
|
======================
|
||||||
|
|
||||||
|
FIXME Describe the ConnectionInfo object and each of its attributes.
|
||||||
|
|
||||||
|
|
||||||
|
Accessing connections by name
|
||||||
|
=============================
|
||||||
|
|
||||||
|
Access named connections directly through
|
||||||
|
``django.db.connections``. Each entry in ``django.db.connections`` is
|
||||||
|
a ``ConnectionInfo`` instance bound to the settings configured in the
|
||||||
|
OTHER_DATABASES entry under the same key.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
from django.db import connections
|
||||||
|
|
||||||
|
private_db = connections['private']
|
||||||
|
cursor = private_db.connection.cursor()
|
||||||
|
|
||||||
|
|
||||||
|
Using transactions with other database connections
|
||||||
|
==================================================
|
||||||
|
|
||||||
|
Transaction managed state applies across all connections
|
||||||
|
commit/rollback apply to all connections by default
|
||||||
|
but you can specify individual connections or lists or dicts of connections
|
||||||
|
|
||||||
|
|
||||||
|
Changing model connections on the fly
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Here's an example of primitive mirroring::
|
||||||
|
|
||||||
|
# Read all articles from the private db
|
||||||
|
# Note that we pull the articles into a list; this is necessary
|
||||||
|
# because query sets are lazy. If we were to change the model's
|
||||||
|
# connection without copying the articles into a local list, we'd
|
||||||
|
# wind up reading from public instead of private.
|
||||||
|
|
||||||
|
Article.objects.db = connections['private']
|
||||||
|
all_articles = list(Article.objects.all())
|
||||||
|
|
||||||
|
# Save each article in the public db
|
||||||
|
Article.objects.db = connections['public']
|
||||||
|
for article in all_articles:
|
||||||
|
article.save()
|
||||||
|
|
||||||
|
Thread and request isolation
|
||||||
|
============================
|
||||||
|
|
||||||
|
connections close after each request
|
||||||
|
connection settings are thread-local
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user