我有一个项目(#1),其中有几个应用程序使用mysql数据库#1。我还有另一个项目(#2),其django代码在同一台服务器上,但它使用不同的mysql数据库(#2)。
我的目标是在项目#1中运行Web应用程序,并使用项目#2中的django模型对db#2进行简单查询。但是,当我从项目#2导入时,它仍然使用#1数据库,即使#2的settings.py文件正确使用数据库#2(即当我在项目#2中运行Web应用程序时,它工作正常)。
以下是我可以作为独立脚本成功运行的整个文件。遗憾的是,当我将文件导入项目#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(使用下面的代码)它失败并出现DatabaseError,表'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,然后发送数据。但是,我认为只要使用模型就会最简单。
感谢。
------- 4月13日,太平洋标准时间11:35添加----
这是一个更简单的问题版本:如何从单个独立脚本访问两个不同的项目。以下代码适用于我首先在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")
答案 0 :(得分:0)
您必须将其他项目添加到您的pythonpath(例如,如果您使用的是mod_wsgi,或者在项目manage.py文件中,如果您想在“python manage.py shell”中访问该项目)太)。如果你这样做了它就像魔术一样。
答案 1 :(得分:0)
我无法使用单个脚本解决此问题。我改为使用了两个脚本:第一个将第二个称为shell命令,第二个将数据格式化为stdout列表。
这对于从另一个应用程序的数据库中读取单个数据流的问题已足够强大,但不适合更大的问题,例如需要多个查询或写入第二个应用程序的数据。对于更复杂的问题,添加API(XMLRPC,REST在Django中很容易)来调用正在运行的应用程序。