Django利用/从其他数据库中提取数据

时间:2017-03-23 19:53:38

标签: python django python-3.x

我的问题在2013年的某个时候有所回答here。但是如果有的话,我正在寻找更强大和最新的解决方案。

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

app1中的模型如下:

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中描述数据库。有人能指出我正确的方向吗?

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',
    }
}

3 个答案:

答案 0 :(得分:3)

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

<强> APP1 / routers.py

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 文件中添加以下内容

DATABASE_ROUTERS = ['app1.routers.App1Router',]

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

./manage.py inspectdb --database "sap"

我希望它有所帮助

来源:个人经验和Django文档https://docs.djangoproject.com/en/1.10/topics/db/multi-db/

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

其他答案已经提到了这个问题的多数据库性质,并与文档相关联。

您可能希望使用类似Django REST Frame的内容来运行对其他表的访问,作为应用程序其余部分的迷你服务,而不是尝试在Views代码中上下文切换数据库调用。

E.g。如果您需要在SAPSalesForce表中查找数据,则使用该ID向后端服务发出Ajax请求。它将根据您的需要向您发送JSON答案。

通过这种方式,您可以在将来抽象关系并更改实现细节,而无需重写大量代码。