django - Django 和 postgresql 模式
问题描述
我整个星期都在尝试解决这个问题,非常感谢您的帮助。
我在 postgres 数据库中有各种模式,我希望能够从相同或跨不同的 django 应用程序映射到它们。
一些模式是:
样品
挖掘
地球物理学
...
我已经尝试了推荐的方法,但是我没有从模式中获取任何数据来显示,我只能使用托管表连接到公共模式。这是来自 settings.py 文件的数据库连接。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=django,public'
},
'NAME': 'gygaia',
'USER': 'appuser',
'PASSWORD': 'secret',
},
'samples': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=samples,public'
},
'NAME': 'gygaia',
'USER': 'appuser',
'PASSWORD': 'secret',
},
}
来源:https ://www.amvtek.com/blog/posts/2014/Jun/13/accessing-multiple-postgres-schemas-from-django/
在 model.py 我添加:
from django.db import models
# Create your models here.
class Storage(models.Model):
#id = models.IntegerField(default=0)
storage_id = models.AutoField(primary_key=True)
store_name = models.CharField(max_length=200, default='')
address_1 = models.CharField(max_length=200, default='')
address_2 = models.CharField(max_length=200, default='')
region = models.CharField(max_length=200, default='')
city = models.CharField(max_length=200, default='')
zip = models.CharField(max_length=200, default='')
country = models.CharField(max_length=200, default="Turkey")
user = models.CharField(max_length=200, default="Gygaia")
datestamp = models.DateTimeField(auto_now=True)
class Meta():
managed=False
db_table = 'samples\".\"store'
我不想将模式限制为用户,并且数据库是几年前创建的,所以我不允许将它全部放在一个模式下。我知道在 stackoverflow 和互联网的其他核心上发布了各种解决方案,我已经尝试过这些,但我无法让它工作。任何想法如何解决那些?
解决方案
因为 Django 不支持开箱即用的 Postgres 数据库模式,所以为了让它工作,请使用数据库路由器。
我创建了一个测试数据库来尝试这个,这里是如何重现它:
使用 psql 创建一个测试数据库:
CREATE USER tester WITH PASSWORD 'lol so easy';
CREATE DATABASE multi_schema_db WITH OWNER tester;
CREATE SCHEMA samples AUTHORIZATION tester;
CREATE TABLE samples.my_samples (
id INTEGER NOT NULL PRIMARY KEY,
description CHAR(255) NOT NULL
);
将模式添加到设置中作为不同的数据库连接,请记住添加HOST
以避免“对等身份验证失败”错误。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=django,public'
},
'NAME': 'multi_schema_db',
'USER': 'tester',
'PASSWORD': 'lol so easy',
'HOST': 'localhost'
},
'samples': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=samples,public'
},
'NAME': 'multi_schema_db',
'USER': 'tester',
'PASSWORD': 'lol so easy',
'HOST': 'localhost'
},
}
接下来创建MySample
模型:
from django.db import models
class MySample(models.Model):
description = models.CharField(max_length=255, null=False)
class Meta:
managed = False
db_table = 'my_samples'
创建一个数据库路由器,将所有与样本相关的查询定向到样本数据库:
from database_test.models import MySample
ROUTED_MODELS = [MySample]
class MyDBRouter(object):
def db_for_read(self, model, **hints):
if model in ROUTED_MODELS:
return 'samples'
return None
def db_for_write(self, model, **hints):
if model in ROUTED_MODELS:
return 'samples'
return None
基本上,路由器会将 ROUTED_MODELS 中指定的所有模型路由到数据库连接samples
,并为所有其他模型返回 None。这会将它们路由到default
数据库连接。
最后将路由器添加到您的 settings.py
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
现在在对模型进行查询时MySample
,它将从samples
模式中获取数据。
推荐阅读
- python - 比特币算法未正确迭代历史数据
- c# - 为什么字符串规范化在 Xamarin Forms 中不起作用?
- docker - AWS Elastic Container Service CI 模板问题
- r - 并非所有计数都与 geom_text 一起出现
- ios - 受约束的协议仍然抱怨是通用的
- kubernetes - 主库 Kube_Client_Errors 中的 Kubernetes Kube 错误
- java - Java 中的 C# IEnumerable
- windows - Windows DLL用户空间调用过程
- html - 移动设备上标题下方的额外空间
- android - 如何在 react native 中使用 @react-native-mapbox-gl/maps 库实现地理编码器