Spa*_*ger 13 django postgresql schema database-schema
我整个星期都在尝试解决这个问题,非常感谢.
我在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',
},
}
Run Code Online (Sandbox Code Playgroud)
来源: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'
Run Code Online (Sandbox Code Playgroud)
我不想将模式限制为用户,并且数据库是在几年前创建的,所以我不允许在一个模式下完成所有这些.我知道在stackoverflow和互联网的其他核心人员上发布了各种解决方案,我已经尝试了这些,但我无法让它工作.任何想法如何解决一个?
tar*_*kki 16
因为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
);
Run Code Online (Sandbox Code Playgroud)
将模式作为不同的数据库连接添加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'
},
Run Code Online (Sandbox Code Playgroud)
}
接下来创建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'
Run Code Online (Sandbox Code Playgroud)
创建数据库路由器以将所有与样本相关的查询定向到示例数据库:
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
Run Code Online (Sandbox Code Playgroud)
基本上,路由器会将ROUTED_MODELS中指定的所有模型路由到数据库连接,samples并为所有其他模型返回None.这会将它们路由到default数据库连接.
最后将路由器添加到settings.py中
DATABASE_ROUTERS = ('database_test.db_router.MyDBRouter',)
Run Code Online (Sandbox Code Playgroud)
现在,在对MySample模型进行查询时,它将从samples模式中获取数据.
小智 9
我也咨询了该来源,但我无法像您一样解决它,但是通过执行测试,我实现了以下目标。
例如,如果我们有模式 foo 和 bar,在 Meta 中写入:
class MySample1 (models.Model):
description = models.CharField (max_length = 255, null = False)
class Goal:
managed = True
db_table = 'fo\".\"my_samples1'
class MySample2 (models.Model):
description = models.CharField (max_length = 255, null = False)
class Goal:
managed = True
db_table = 'bar\".\"my_samples2'
Run Code Online (Sandbox Code Playgroud)
然后我们可以将每个模型重定向到我们想要的方案,前提是我们在 True 中管理了变量。限制是我们必须自己命名表。
| 归档时间: |
|
| 查看次数: |
9959 次 |
| 最近记录: |