django - 如何将特定的 Django 应用程序存储在另一个 Postgresql 数据库中

标签 django postgresql foreign-keys remote-server django-apps

最近我下载了 django_messages应用程序 (私有(private)用户到用户消息传递 django 应用程序) 并将其添加到我的 django 项目中。

settings.py

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'mydjangoapp.mydjangoappdb',
    'tastypie',
    'gunicorn',
    'south',
    'relationships',
    'pyapns',
    'django_messages',

该应用运行良好,与 Django 配合良好。然而,对于消息传递等功能,数据库可能会变得非常大。我决定创建一个专用数据库来存储所有 django_messages 数据。

settings.py

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': 'django_db',                      
    'USER': 'django_login',                      
    'PASSWORD': 'xxxx',                  
    'HOST': '',                     
    'PORT': '',                      
},
'message_db': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',  
    'NAME': 'django_messagedb',                      
    'USER': 'django_login',                      
    'PASSWORD': 'xxxx',                 
    'HOST': 'XX.XXX.XX.XXX',                     
    'PORT': '5432', 
}

DATABASE_ROUTERS = ['mydjangoapp.messagerouter.MessageRouter']      

为了澄清,这是我的 messagerouter.py

class MessageRouter(object):
"""
A custom router written by Riegie to 
control all database operations on models in the 
django_messages application
"""
     def db_for_read(self, model, **hints):
         """
         Attempts to read django_messages models go to
         message_db.
         """
         if model._meta.app_label == 'django_messages':
             return 'message_db'
         return None

     def db_for_write(self, model, **hints):
         """
         Attempts to write django_messages models to go to
         message_db.
         """
         if model._meta.app_label == 'django_messages':
             return 'message_db'
         return None

     def allow_relation(self, obj1, obj2, **hints):
         """
         Allow relations if a model in the django_messages.
         """
         if obj1._meta.app_label == 'django_messages' or \
         obj2._meta.app_label == 'django_messages':
             return True
         return None

     def allow_syncdb(self, db, model):
         """  
         Make sure the django_messages app only appears in the
         'message_db" database.
         """
         if db == 'message_db':
             return model._meta.app_label == 'django_messages'
         elif model._meta.app_label == 'django_messages':
             return False
         return None 

如您所见,我有两个数据库,一个在运行 Django 的本地机器上,另一个在远程机器上。开箱即用,安装后,django_messages 自然会在默认数据库上创建表。但是,我希望它只在“message_db”数据库上创建表。

我调查了 Multi-db Setup Django 文档,但它详细介绍了主/从配置。我使用了 Auth Router 示例并创建了 messagerouter.py。一切都同步了,我没有收到任何错误。

enter image description here

然而,当我检查远程数据库时,该表不存在!这是为什么?是不是因为不能和Django User建立远程外键表关系?


更新

所以我设法使用以下命令将 Django_messages 应用同步到其他数据库:./manage.py syncdb --database=message_db。这很棒。但是,当我从 Django 管理页面访问应用程序时,出现以下错误:

DatabaseError at /admin/django_messages/message/

relation "django_messages_message" does not exist
LINE 1: SELECT COUNT(*) FROM "django_messages_message"

我觉得这个错误很奇怪,因为我可以通过 pgadmin III 查看另一台服务器上的表。所以同步工作正常,但现在 Django 似乎无法识别该表。也许我的 messagrouter.py 做错了什么?

最佳答案

所以在做了很多研究之后,我终于遇到了这个,我希望我早点看到它。 Django 不支持跨数据库关系:https://docs.djangoproject.com/en/dev/topics/db/multi-db/#no-cross-database-relations

正如它所说: Django 目前不支持外键或跨多个数据库的多对多关系。如果您使用路由器将模型分区到不同的数据库,则这些模型定义的任何外键和多对多关系必须在单个数据库内部。

这是因为参照完整性。为了维护两个对象之间的关系,Django 需要知道关联对象的主键是否有效。如果主键存储在单独的数据库中,则无法轻松评估主键的有效性。

如果您将 Postgres、Oracle 或 MySQL 与 InnoDB 结合使用,则这是在数据库完整性级别强制执行的——数据库级别的键约束可防止创建无法验证的关系。

但是,如果您将 SQLite 或 MySQL 与 MyISAM 表一起使用,则没有强制的参照完整性;因此,您可以“伪造”跨数据库外键。但是,Django 官方不支持此配置。

希望这个答案能为你们中的许多人省去麻烦。

关于django - 如何将特定的 Django 应用程序存储在另一个 Postgresql 数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16181291/

相关文章:

python - 当架构名称与表名称一起传递时,Django migrate 不起作用

sql - postgres 选择聚合时间跨度

sql-server - 在 SQL Server 和 Postgresql 中将字符串转换为 datetimeoffset

php - Codeigniter - 外键

django - 我可以在没有测试客户端的情况下访问测试 View 的响应上下文吗?

python - .po 文件中的 Django 生成的波兰语复数形式不起作用

python - Django filter_horizo​​ntal 用于多对一关系

python - 使用 psycopg2 python 库构建 SQL 动态查询并使用良好的转换类型工具

sqlite - 在同一个表 SQLite 上创建外键

mySQL 创建外键