将 Django 模型迁移到 Postgresql 模式
Migrate Django model to Postgresql schema
我想通过 Django 迁移在特定的 Postgresql 模式(即“schema1”)中创建一个新的 table。
尽管遵循 this blog or this post 中的方法 1,迁移仍将 table 发送到默认架构 "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
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
我正在尝试迁移的模型 class 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 returns以下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 中根本无法实现?
您必须在 运行 迁移时明确提供数据库定义的名称:
$ python manage.py migrate legacydbapp --database schema1
要确保模型 MyUser
仅在特定数据库中创建,您的路由器必须实施 .allow_migrate()
您好,要将一个模型迁移到您可以使用的特定场景:
python manage.py migrate legacydbapp -s schema1
我想通过 Django 迁移在特定的 Postgresql 模式(即“schema1”)中创建一个新的 table。
尽管遵循 this blog or this post 中的方法 1,迁移仍将 table 发送到默认架构 "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
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
我正在尝试迁移的模型 class 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 returns以下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 中根本无法实现?
您必须在 运行 迁移时明确提供数据库定义的名称:
$ python manage.py migrate legacydbapp --database schema1
要确保模型 MyUser
仅在特定数据库中创建,您的路由器必须实施 .allow_migrate()
您好,要将一个模型迁移到您可以使用的特定场景:
python manage.py migrate legacydbapp -s schema1