Поддержка нескольких баз данных в Django - PullRequest
10 голосов
/ 06 ноября 2008

Из какого-то форума я узнал, что поддержка нескольких баз данных добавлена ​​в Django на более низком уровне, но API более высокого уровня еще не добавлены.

Может кто-нибудь сказать мне, как можно добиться нескольких соединений с базой данных в Django.

Кто-нибудь имеет представление о том, когда Django будет полностью / официально поддерживать несколько подключений к базе данных.

Ответы [ 10 ]

9 голосов
/ 03 декабря 2009

Если вам просто нужно несколько соединений, вы можете сделать что-то вроде этого:

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()
6 голосов
/ 17 февраля 2010

Это будет в Джанго 1.2.

См. http://docs.djangoproject.com/en/dev/topics/db/multi-db/

4 голосов
/ 06 ноября 2008

Последнее обсуждение, которое я видел по этому поводу, было в Предложение: удобный API для поддержки нескольких баз данных Поток django-developers, в котором также есть пример одного способа использования нескольких баз данных. используя менеджеров в исходном сообщении.

3 голосов
/ 07 ноября 2008

Если вы прочитаете несколько из множества ( много ) тем на эту тему в django-dev, вы увидите, что то, что выглядит просто, не так. Если вы выберете один вариант использования, то это будет легко, но как только вы начнете обобщать, у вас начнутся проблемы.

Чтобы использовать приведенный выше поток в качестве примера, когда вы говорите "несколько баз данных", о чем вы говорите?

  • Все БД на одной машине под одним и тем же двигателем.
  • Все БД на одной машине, разные движки (например, MySQL + PostgreSQL)
  • Одна мастер-база данных с N ведомыми только для чтения на разных машинах.
  • Разделение таблиц между несколькими серверами БД.

Вам понадобится:

  • Внешние ключи в БД
  • СОЕДИНЕНИЯ по машинам и / или двигателям
  • и т.д.. и т.д.

Одна из проблем с гладким ORM, как у Django, заключается в том, что он скрывает все эти грязные детали под хорошей работой покраски. Продолжить делать это, но затем добавить что-либо из вышеперечисленного, нелегко (тм).

2 голосов
/ 15 июня 2009

Эрик Флоренцано написал очень хороший пост в блоге, который позволяет вам поддерживать несколько баз данных: Поддержка Easy MultipleDatabase для Django .

Он начинается с создания нового пользовательского менеджера, который позволяет указывать настройки базы данных.

1 голос
/ 30 января 2013

Несколько баз данных на выбор

Нам всегда нужен один именованный по умолчанию, остальные будут за вами.

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
1 голос
/ 16 декабря 2011

Для запросов, сохранения и удаления существует директива using.

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

0 голосов
/ 06 апреля 2010

Начиная с Django 1.2, он будет поддерживать несколько баз данных. Смотри: http://docs.djangoproject.com/en/dev/topics/db/multi-db/ Версия 1.2 сейчас в бета-версии

0 голосов
/ 17 августа 2009

Подход Эрика Флоренцано работает хорошо, если все ваши базы данных используют один и тот же движок. Если у вас разные движки (в моем случае Postgres и MSSQL), вы столкнетесь со многими проблемами в коде ORM (например, models / sql / where.py с использованием синтаксиса SQL по умолчанию для соединения).

Если вам нужно, чтобы это работало, вам следует дождаться проекта MultiDB Алекса Гейнора, который запланирован на Django 1.2

0 голосов
/ 07 ноября 2008

Я думаю, что вам придется прибегнуть к "сырой sql" .. вроде вещи ..
смотрите здесь: http://docs.djangoproject.com/en/dev/topics/db/sql/

вам нужно «соединение» с вашей другой базой данных, если вы посмотрите на django/db/__init__.py вокруг строки 39 (в моей версии ..)

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

попробуй оттуда взять ..
Постскриптум Я действительно не пробовал это или что-то еще ... просто пытался указать общее направление того, что, по моему мнению, может решить вашу проблему.

...