如何在另一个Postgresql数据库中存储特定的Django应用程序
最近我下载了
django_messages应用程序(私人用户到用户消息传递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','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,**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文档,但它详细介绍了Master / Slave配置.我使用了Auth Router示例并创建了messagerouter.py.一切都同步,我没有错误. 但是,当我检查远程数据库时,表不存在!这是为什么?是因为不可能与Django用户建立远程外键表关系吗? UPDATE 所以我设法使用以下命令将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无法识别该表.我的messagerouter.py可能做错了吗? 解决方法
经过大量的研究,我终于遇到了这个,我希望我早些看过它. Django不支持跨数据库关系:
https://docs.djangoproject.com/en/dev/topics/db/multi-db/#no-cross-database-relations
如上所述: 这是因为参照完整性.为了维护两个对象之间的关系,Django需要知道相关对象的主键是有效的.如果主键存储在单独的数据库中,则无法轻松评估主键的有效性. 如果您将Postgres,Oracle或MySQL与InnoDB一起使用,则会在数据库完整性级别强制执行 – 数据库级别的键约束会阻止创建无法验证的关系. 但是,如果您将SQLite或MySQL与MyISAM表一起使用,则不存在强制参照完整性;因此,您可以“伪造”跨数据库外键.但是,Django并未正式支持此配置. 希望这个答案可以为你们许多人省去麻烦. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ajax、jsp、xml结合的一个小例子
- oracle – JodaTime或Java 8是否特别支持JD Edwards日期和时
- TinyXml Documentation 翻译 TinyXML Tutorial翻译
- oracle – 来自无向图的最小ID
- sax解释xml
- 在Oracle 11g2 XE中编译PL / SQL函数有时会导致ORA-00600:
- entity-framework – 实体框架SaveChanges不保存数据
- ORACLE EVENT事件跟踪
- C重载<<没有const输入对象??会产生错误,它会随着const对象
- 用 AXMLPrinter2、baksmali、smali、dex2jar 反编译.xml文件