Version 4 (modified by 18 years ago) ( diff ) | ,
---|
Multiple Database Support
Work is underway on a patch for #1142, which will add support for multiple database connections. This page documents my current plan and progress towards a fully working patch.
The plan
- Avoid any change that impacts backward compatibility. The intent is to add new functionality for those who need it, not to change the most common use case of a single database connection.
- Add a new settings variable, DATABASES. DATABASES is a dict of named database connection parameter sets. In each set, the keys are the same as the standard database connection settings variables.
DATABASES = { 'a': { 'DATABASE_ENGINE': 'sqlite3', 'DATABASE_NAME': '/tmp/dba.db' }, 'b': { 'DATABASE_ENGINE': 'sqlite3', 'DATABASE_NAME': '/tmp/dbb.db' }}
- Add db_connection to Meta. This allows model classes to specify which connection they should use.
class Artist(models.Model): name = models.CharField(maxlength=100) alive = models.BooleanField(default=True) def __str__(self): return self.name class Meta: db_connection = 'a' class Widget(models.Model): code = models.CharField(maxlength=10, unique=True) weight = models.IntegerField() def __str__(self): return self.code class Meta: db_connection = 'b'
- Allow transaction decorators, etc to take optional connections argument. Without that argument, transactions will apply across all connections already in use.
- Move generation of schema manipulating sql (CREATE TABLE, etc) from django.core.management into backend.creation.
- Add methods to Manager to support per-model installation. This will enable each model to be installed using the connection that it specifies. It causes some complications, mainly in determining the correct order in which to install. My current solution is to depend on the developer already having figure that out by defining her models in a sensible order; and, when that fails, punting any unresolved constraints to the end of the syncdb or install process. The manager methods will delegate to each model's backend to do the sql creation.
Current status
Current patch is attached (p5.diff). It implements most of the model-level changes, a few manager-level changes, and table creation, including generation (but not execution) of many-many tables. Relative to p4.diff, this patch adds transaction support and many-many table creation and fixes a few bugs. Nothing has been removed yet from django.core.management; the model table creation code there has just been adapted in django.db.backends.ansi.creation.
Attachments (6)
-
p4.diff
(36.2 KB
) - added by 18 years ago.
Current (incomplete) patch as of 2006-06-08
-
naive-transaction.diff
(3.1 KB
) - added by 18 years ago.
naive first pass at allowing transactions to work
-
p5.diff
(52.8 KB
) - added by 18 years ago.
Updated patch including transaction support
-
naive-related.diff
(2.4 KB
) - added by 18 years ago.
naive first pass at getting related fields to work
-
multidbsample.tar.gz
(5.9 KB
) - added by 18 years ago.
Small sample of connecting to two databases, and pulling data back from both of them.
-
djangomultidbhowto.doc
(52.0 KB
) - added by 18 years ago.
A guide to installing the Multiple DB Branch, and then creating a project to work with multiple legacy databases.
Download all attachments as: .zip