gpt4 book ai didi

django - 将 Django 模型迁移到 Postgresql 模式

转载 作者:行者123 更新时间:2023-11-29 12:15:55 25 4
gpt4 key购买 nike

我想通过 Django 迁移在特定的 Postgresql 模式(即“schema1”)中创建一个新表。

尽管遵循 this blog 中的方法 1或 this post ,迁移会将表发送到默认模式“public”而不是“schema1”。

settings.py 中,我有:

DATABASES = {

'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=django,public'
},
'NAME': 'myDB',
'USER': 'username',
'PASSWORD': '***',
'HOST': 'my.host.address',
'PORT': '1234',
},

'schema1': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'OPTIONS': {
'options': '-c search_path=schema1,public'
},
'NAME': 'myDB',
'USER': 'username',
'PASSWORD': '***',
'HOST': 'my.host.address',
'PORT': '1234',
}
}


#Path to DBrouter to handle PG schemas https://stackoverflow.com/a/51007441/3976696
DATABASE_ROUTERS = ('djangogirls.dbrouters.MyDBRouter',)

djangogirls/dbrouters.py 中,我有:

from legacydbapp.models import MyUser

# Include here any class (i.e. table) that belongs to the schema "schema1"
ROUTED_MODELS_SCHEMA1 = [MyUser]


class MyDBRouter(object):
"""
A router to place DB queries into correct schema depending on considered tables.
"""
def db_for_read(self, model, **hints):
if model in ROUTED_MODELS_SCHEMA1 :
return 'schema1'
return None

def db_for_write(self, model, **hints):
if model in ROUTED_MODELS_SCHEMA1 :
return 'schema1'
return None

以及我正在尝试迁移的模型类,在 models.py 中:

class MyUser(models.Model):
first_name = models.CharField(max_length=30, default='',null=True, blank=True)
last_name = models.CharField(max_length=30, default='', null=True, blank=True)
profession = models.CharField(max_length=32,default='', null=True, blank=True)
def __str__(self):
return self.first_name + " " + self.last_name
class Meta:
managed = True
db_table = 'myuser'

我运行了以下命令:

$ python manage.py makemigrations legacydbapp
$ python manage.py sqlmigrate legacydbapp 0001_initial
$ python manage.py migrate legacydbapp

并且 sqlmigrate 返回以下 SQL:

BEGIN;
--
-- Create model MyUser
--
CREATE TABLE "myuser" (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NULL,
"last_name" varchar(30) NULL,
"profession" varchar(32) NULL);
COMMIT;

如果 DB 路由器正常工作,我希望 SQL 改为读取 CREATE TABLE "schema1.myuser",但事实并非如此。我是不是搞砸了什么地方,或者这在 Django 2.1.5 中根本无法实现?

最佳答案

运行 migrate 时必须明确提供数据库定义的名称:

$ python manage.py migrate legacydbapp --database schema1

为确保模型MyUser 仅在特定数据库中创建,您的路由器必须实现.allow_migrate()

关于django - 将 Django 模型迁移到 Postgresql 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54751652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com