首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django利用/拉取来自其他数据库的数据

Django利用/拉取来自其他数据库的数据
EN

Stack Overflow用户
提问于 2017-03-24 03:53:38
回答 3查看 1.3K关注 0票数 3

我下面的问题在2013年的here中得到了一定程度的回答。但我正在寻找更强大和最新的解决方案,如果有任何。

我有一个Django应用程序app1,我想捆绑在Django从其他数据库谁是每天不断更新的数据。例如:在app1中,我有一个模型model,其中用户必须从sap输入销售订单,并从salesforce输入相应的商机编号。我有工具可以将数据从sap转储到sapdb,将salesforce转储到salesforcedb

我在app1中的模型如下所示:

代码语言:javascript
运行
复制
class SalesOrderMapping(models.Model):
    sales_order = models.CharField("Sales Order #", max_length=10, primary_key=True)
    opportunity_number = models.CharField("Opportunity Number", max_length=30)

    class Meta:
        verbose_name_plural = "Sales Order / Opportunity Mapping"
        ordering = ('sales_order', 'opportunity_number')

    def __str__(self):
        return self.sales_order

如您所见,在上面模型中,我有opportunity_number,我希望用户键入sales_order,而不是键入opportunity_number,它可以是自动完成文本框(理想情况下),也可以是由salesforcedb中的表填充的下拉列表。到目前为止,我已经能够用settings.py描述数据库了。有人能告诉我正确的方向吗?

代码语言:javascript
运行
复制
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'djangoportal',
        'USER': 'myuser',
        'PASSWORD': 'mypass',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    },

    'sap': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sapdb',
        'USER': 'myuser',
        'PASSWORD': 'mypass',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    },

    'sfdc': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'salesforcedb',
        'USER': 'myuser',
        'PASSWORD': 'mypass',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    }
}
EN

回答 3

Stack Overflow用户

发布于 2017-03-30 18:57:40

首先,您需要为您的应用程序提供一个数据库路由器,我将尝试使用给定的信息执行与您所需的操作类似的操作

app1/routers.py

代码语言:javascript
运行
复制
class App1Router(object):
    def db_for_read(self, model, **hints):

        if model._meta.app_label == 'app1':
            return 'default'
        return None
    def db_for_write(self, model, **hints):
        """
        Attempts to write auth models go to app1.
        """
        if model._meta.app_label == 'app1':
            return 'default'
        return None
    def allow_relation(self, obj1, obj2, **hints):
         db_list = ('default', 'sap', 'sfdc')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None
    def allow_migrate(self, db, app_label, model_name=None, **hints):
        return True

并在您的settings.py文件中添加以下内容

代码语言:javascript
运行
复制
DATABASE_ROUTERS = ['app1.routers.App1Router',]

您可以使用检查数据库命令来创建现有数据库的模型,例如:

代码语言:javascript
运行
复制
./manage.py inspectdb --database "sap"

我希望它能帮上忙

来源: Personal experience和Django文档https://docs.djangoproject.com/en/1.10/topics/db/multi-db/

票数 4
EN

Stack Overflow用户

发布于 2017-03-24 04:53:39

Django支持多个数据库,如下所述:

https://docs.djangoproject.com/en/1.10/topics/db/multi-db/

假设您将主数据库设置为主数据库,则必须确保在从另一个数据库读取数据时指定要访问的数据库。

票数 1
EN

Stack Overflow用户

发布于 2017-04-05 08:48:30

其他答案已经提到了这一点的多DB性质,并链接到文档。

您可能想要使用类似Django REST Frame的东西来运行对其他表的访问,作为应用程序其余部分的一个微型服务,而不是试图在视图代码中切换DB调用的上下文。

例如,如果您需要在SAPSalesForce表中查找数据,您可以使用该ID向您的后端服务发出Ajax请求,它将向您发送一个包含您需要的任何内容的JSON应答。

这样,您就可以在将来抽象关系并更改实现细节,而不必重写大量代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42985769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档