У меня есть проект (# 1) с парой приложений в нем, использующий базу данных MySQL № 1. У меня также есть другой проект (# 2), чей код django находится на том же сервере, но он использует другую базу данных mysql (# 2).
Моя цель - запустить веб-приложение в проекте № 1 и использовать модели django из проекта № 2 для простого запроса к базе данных № 2. Однако, когда я импортирую из проекта № 2, он все еще использует базу данных № 1, хотя файл settings.py для № 2 соответственно использует базу данных № 2 (т.е. когда я запускаю веб-приложение в проекте № 2, он работает нормально ).
Вот полный файл, который я могу успешно запустить как отдельный скрипт. К сожалению, когда я импортирую файл в проект # 1 и запускаю функцию, он выходит из строя (потому что он ищет в db # 1 таблицу):
import sys
def get_stuff_from_project2(ids):
from django.core.management import setup_environ
from project2 import settings
setup_environ(settings)
from project2.myapp2.models import mymodel2
all_rows = mymodel2.objects.filter(id__in=ids).values()
return(all_rows)
# as a standalone script, run the main function
if __name__ == "__main__":
sys.path.append("/home/me/django")
print str ( get_stuff_from_project2( sys.argv[1:] ) )
Опять же, это работает как отдельный скрипт. Но из проекта № 1 (с использованием приведенного ниже кода) он завершается с ошибкой DatabaseEr. Таблица 'db1.myapp2_mymodel2' не существует:
from project1.myapp1.standalone_script import get_stuff_from_project2
all_rows = get_stuff_from_project2( ids )
Я предполагаю, что функция setup_environ фактически не обрабатывает новое DATABASE_NAME или что она не может изменить существующее DATABASE_NAME после установки настроек?
В этот момент я немного растерялся и пытался найти решение. Я на самом деле не хочу идти в ногу с подходом «несколько сайтов» или «несколько баз данных», так как мне бы очень хотелось, чтобы проект 1 и проект 2 были как можно более раздельными. Мой альтернативный вариант - вызвать автономный скрипт как системный вызов из проекта 1 или создать представление в проекте 2, которое представляет собой API и отправляет данные. Но я подумал, что простое использование модели было бы проще, если бы она работала.
Спасибо.
------- добавлено 13 апреля, 11:35 PST ----
Вот более простая версия вопроса: как я могу получить доступ к двум разным проектам из одного автономного скрипта. Следующий код работает нормально для любого проекта, в котором я сначала выполняю setup_environ, но он не может выполнить второй:
import sys
from django.core.management import setup_environ
sys.path.append('/home/me/django')
from project1 import settings
print setup_environ(settings) # shows /home/me/django/project1
print settings.DATABASE_NAME # shows db1
from project1.myapp1.models import mymodel1
mymodel1.objects.filter(id=9376544).values() # works fine
from project2 import settings
print setup_environ(settings) # shows /home/me/django/project2
print settings.DATABASE_NAME # shows db2
from project2.myapp2.models import mymodel2
mymodel2.objects.filter(id=6544).values() # fails with:
# django.db.utils.DatabaseError: (1146, "Table 'db1.myapp2_mymodel2' doesn't exist")