繁体   English   中英

如何使用一个数据库来运行django服务,而另一个数据库来获取数据

[英]How to use one db to run the django service and other to fetch data

我有一个现有的应用程序数据库,我的网站仅应根据用户输入从中获取数据。 settings.py文件中添加了数据库详细信息,我尝试了python manage.py integratedb并获得了所有300多个表到我的models.py文件中。 我从来没有做过python manage.py runserver它抛出一百万个错误。 现在我找到了解决方法,但是我需要您对此发表意见。

我将默认服务器添加到settings.py并使用它可以运行服务器。 settings.py看起来像这样。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'mydatabase',
        },
    'user': {   
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME'  : 'test',
        'USER'  : 'testuser',
        'PASSWORD': 'readonly',
        'HOST'  : '10.20.30.40',
        'PORT'  : '5446',
    }
}

现在我可以访问user db以从表单中获取数据了吗? 例如

views.py看起来像这样

from django.shortcuts import render_to_response
from .models import TestCases
from django.shortcuts import HttpResponse
from django.http import JsonResponse
from django.forms.models import model_to_dict
from django.views.decorators.csrf import csrf_exempt


# Create your views here.

@csrf_exempt
def index(request):
    posts = TestCases.objects.all()[:10]
    return render_to_response('index.html',{'posts':posts})

其中, TestCases是来自models.py文件的类名。

现在,当我单击按钮以检索数据时,我得到“没有这样的表:test_cases”

models.py looks like


class TestCases(models.Model):
    id = models.BigIntegerField(primary_key=True)
    clientid = models.ForeignKey(Clients, db_column='clientid')
    projectid = models.ForeignKey(Projects, db_column='projectid')


    class Meta:
        managed = False
        db_table = 'test_cases'

我从用户输入中获取数据时做错了什么。 请帮忙。

Queryset .using()方法

我想Django将使用默认数据库。

尝试这个:

@csrf_exempt
def index(request):
    posts = TestCases.objects.using('user').all()[:10]
    return render_to_response('index.html',{'posts':posts})

using设置为queryset时,可以指定django将要查询的数据库。

Django文档中的更多信息

更好的方法,因此您不必手动将其设置为所有查询。

您可以将其手动添加到所有查询中,也可以为对象创建自定义管理器,并强制其对对象使用特定的数据库。

例如:

# this will override the default queryset for objects that use this Manager
class UserDatabaseManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().using('user')


class MyModel(models.Models):
    objects = UserDatabaseManager()

然后,当您使用MyModel ,您可以像MyModel进行查询,并且Django将仅对具有objects = UserDatabaseManager()模型使用user db作为默认值。

请记住,这只是Manager的简单使用,您可以拥有多个Manager并做很多很酷的事情。

看看Django Managers文档

首先,您需要执行以下操作:

python manage.py inspectdb > models.py

将您的模型存储到models.py

默认情况下,inspectdb创建非托管模型。 也就是说,模型的Meta类中的managed = False告诉Django不要管理每个表的创建,修改和删除,如果您希望允许Django管理表的生命周期,则需要将上面的Managed选项更改为True (或直接删除它,因为True是其默认值)。

接下来,运行migrate命令以安装任何其他需要的数据库

python manage.py migrate

整合文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM