【问题标题】:Django: how to use two different databases with Wagtail CMSDjango:如何在 Wagtail CMS 中使用两个不同的数据库
【发布时间】:2016-01-07 15:39:01
【问题描述】:

在一个 Django 项目中,我有一个应用程序 otherapp,它访问远程服务器上的 Postgres 数据库,其中包含抓取的数据。我有第二个应用程序 content,它访问 same 远程服务器上的 不同 Postgres 数据库,并包含我希望通过 Wagtail CMS 提供服务的页面。

我使用these 指令在本地安装了 Wagtail(我没有使用 Wagtail 安装程序)。我让它在本地工作。然后,我对本地数据库做了一个 pg_dump,在远程数据库服务器上做了 psql db2

每个应用程序都可以单独在本地正常工作,但我无法让它们一起工作。我想我可以使用database router 来指定我想使用哪个数据库来检索不同类型的数据。

但是,当我将数据库路由器放入设置文件时,它开始出现故障。我怎样才能解决这个问题?我需要在项目的其他地方声明 wagtailcore 吗?

settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db1',
        'USER': DB_USERNAME,
        'PASSWORD': DB_PASSWORD,
        'HOST': HOST,
        'PORT': PORT 
    },
    'CMS': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'db2',
        'USER': DB_USERNAME,
        'PASSWORD': DB_PASSWORD,
        'HOST': HOST,
        'PORT': PORT 
    }

}
DATABASE_ROUTERS = [ 'projectname.routers.FindRouter',]

routers.py:

import os
from django.conf import settings
import socket
class FindRouter(object):
    def db_for_read(self, model, **hints) :
        if model._meta.app_label == 'content' :
            return 'CMS'
        return None
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'content' :
            return 'CMS'
        return None
    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'content' :
            return 'CMS'
        return None
    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'content' or obj2._meta.app_label == 'content':
            return True
        return None
    def allow_migrate(self, db, app_label, model=None, **hints):
        if app_label == 'content' :
            return db == 'CMS'
        return None

这是我在运行服务器时遇到的错误:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/cms/

Django Version: 1.9
Python Version: 2.7.10
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'wagtail.wagtailforms',
 'wagtail.wagtailredirects',
 'wagtail.wagtailembeds',
 'wagtail.wagtailsites',
 'wagtail.wagtailusers',
 'wagtail.wagtailsnippets',
 'wagtail.wagtaildocs',
 'wagtail.wagtailimages',
 'wagtail.wagtailsearch',
 'wagtail.wagtailadmin',
 'wagtail.wagtailcore',
 'modelcluster',
 'compressor',
 'taggit',
 'otherapp',
 'content']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'wagtail.wagtailcore.middleware.SiteMiddleware',
 'wagtail.wagtailredirects.middleware.RedirectMiddleware']



Traceback:

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  123.                 response = middleware_method(request)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/wagtail/wagtailcore/middleware.py" in process_request
  11.             request.site = Site.find_for_request(request)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/wagtail/wagtailcore/models.py" in find_for_request
  122.                 return Site.objects.get(hostname=hostname)  # Site.DoesNotExist here goes to the final except clause

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/models/manager.py" in manager_method
  122.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/models/query.py" in get
  381.         num = len(clone)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/models/query.py" in __len__
  240.         self._fetch_all()

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/models/query.py" in _fetch_all
  1074.             self._result_cache = list(self.iterator())

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/models/query.py" in __iter__
  52.         results = compiler.execute_sql()

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/models/sql/compiler.py" in execute_sql
  852.             cursor.execute(sql, params)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/backends/utils.py" in execute
  79.             return super(CursorDebugWrapper, self).execute(sql, params)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/utils.py" in __exit__
  95.                 six.reraise(dj_exc_type, dj_exc_value, traceback)

File "/Users/username/.virtualenvs/bail/lib/python2.7/site-packages/django/db/backends/utils.py" in execute
  64.                 return self.cursor.execute(sql, params)

Exception Type: ProgrammingError at /cms/
Exception Value: relation "wagtailcore_site" does not exist
LINE 1: ...ge_id", "wagtailcore_site"."is_default_site" FROM "wagtailco...
                                                             ^

【问题讨论】:

  • 您是否尝试过迁移您的 CMS 数据库? docs.djangoproject.com/en/1.9/topics/db/multi-db/…
  • 如果您尝试从 CMS 数据库中提供鹡鸰,您可能还需要设置路由器来处理所有鹡鸰应用程序。
  • 我确实迁移了。出现了一个新错误:django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES,但未配置设置。您必须在访问设置之前定义环境变量 DJANGO_SETTINGS_MODULE 或调用 settings.configure()。
  • Joey Wilhelm 是正确的 - Wagtail 经常在 Wagtail 自己的应用程序和您自己的页面模型的表之间执行 SQL 连接,因此这些绝对、肯定需要在同一个数据库中。
  • gasman:但是这种拆分真的可行吗?或者 Wagtail 是否会连接到例如用户表?

标签: python django database postgresql wagtail


【解决方案1】:

我放弃并将 Wagtail 表放回第一个数据库,现在应用程序的两个部分可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2010-12-28
    • 2021-12-03
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多