Django与多个数据库的接口(但不迁移)

时间:2014-12-24 12:34:46

标签: python django django-models django-orm

我是Django的新手,所以过去几周它已经成了一个教程。我认为我理解基础知识,并且喜欢从各种教程中制作很多简单的东西(博客,照片画廊,日历等)。我仍然觉得Django是一个初学者,但我现在正在尝试定制它以满足我的项目需求。

情境:我的任务是为两个数据库创建一个接口。界面的主要目的是对表之间的复杂关系进行查看,如果需要也可以编辑它们。我的问题是我对我的两个数据库有基本的读/写访问权限,但不能创建表格。因此,创建模型并使用Django同步/迁移这些数据库是不可能的,因为它想要在这些数据库上创建表来执行它。到目前为止,我的工作重点是获得以下路由/模型结构:

  • 数据库1 :Django Auth / Admin(完全访问权限)
  • 数据库2 :我的第一个数据库(脚本)(仅读/写访问权限:无表创建)
  • 数据库3 :我的第二个数据库(服务)(仅读/写访问权限:无表创建)

我发现的最接近的教程解决了我想要的问题:Reporting Django Multi DB Support,但我的两个数据库在表定义中没有容易分离的前缀,所以我不确定如何编写路由器定义文件,而不是写入 db_for_read / db_for_write 函数中每个数据库中每个表的条件。

我开始觉得我正在努力让Django做一些它真的不想做的事情。

所以我的问题是这个:我是否继续尝试让Django做我想做的事情?如果是这样,那么有没有人有任何可以帮助我的目标资源,教程或建议?我已经阅读了官方文档,但他们似乎没有针对我的问题。

如果我不和Django一起去,我已经考虑过像Flask这样的东西,因为它有更多的自由。然而,我的项目最终将成为一个包含多个项目和应用程序的大型高容量网站。我对Flask的经验很棒,但我担心如果我不小心的话,将它用于如此大规模的项目会导致一些混乱。

有什么建议吗?

更新: 我已经取得了一些进展(部分原因是 yuvi '以下建议),但我仍然有错误。它现在从我想要的路由器读取,但不正确。以下是一些有问题的文件:

settings.py

DATABASE_ROUTERS = ['ticket.DataRouter', 'ticket.ScriptRouter']

ScriptModel.py

from __future__ import unicode_literals
from django.db import models

class Archiveticket(models.Model):
    ....

ScriptRouter.py

class ScriptRouter(object):
    def db_for_read(self, model, **hints):
        return 'Scripts'
    def db_for_read(self, model, **hints):
        return 'Scripts'
    def allow_relation(self, obj1, obj2, **hints):
        return None
    def allow_migrate(self, db, model):
        return False

DataRouter.py

class DataRouter(object):
    def db_for_read(self, model, **hints):
        return 'Data'
    def db_for_read(self, model, **hints):
        return 'Data'
    def allow_relation(self, obj1, obj2, **hints):
        return None
    def allow_migrate(self, db, model):
        return False      

Views.py

from django.http import HttpResponse
from django.shortcuts import render

from django.db import models
from ticket.ScriptModel import Archiveticket

def index(request):
    a = Archiveticket.objects.all()
    return render(request, 'tickets.tmpl', {'obj' : a})

tickets.tmpl

{% for b in obj %}
{{ b.archiveTicketId }}<br/>
{% endfor %}

我在加载网址时遇到错误:

  

ImportError Module&#34; ticket.DataRouter&#34;没有定义&#34; DataRouter&#34;属性/类

但是,如果我查看DataRouter.py文件,那么该类是明确指定的。我一定在这里错过了什么。我知道DataRouter是第一个,因为这是大多数查询的地方,但作为POC,我想查询另一个表,并且在查看第一个数据库时似乎失败了。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您可能想要查看setting up your own routers to control the multiple databases

  

使用多个数据库的最简单方法是设置数据库路由方案。默认路由方案可确保对象保持原始数据库“粘性”[...]

     

但是,如果要实现更有趣的数据库分配   行为,您可以定义和安装自己的数据库路由器。

基本上,您使用以下四种方法配置FooRoute类:db_for_readdb_for_writeallow_relationallow_migrate,然后在{{settings.py中注册它们1}}:

DATABASE_ROUTERS = ['path.to.FooRouter']

查看detailed example

的文档