Django migrate在第二个数据库中创建了错误的表
我想创建一个仅由Django项目中的第二个数据库使用的模型。所以理论上,我会有一个默认数据库,其中包含所有应用程序及其模型,然后这个新数据库将有一个单独的应用程序模型,这将是我的工作数据 我遇到的问题是,每当我迁移到新数据库时,它都会复制所有表,包括只打算在新数据库中的新表。所有原始内容类型、会话、身份验证等都将添加到此新的“作业”数据库中。我只希望Jobdata模型/表位于jobs数据库中 我已经检查了好几次了,但是我设置的路由器并没有太大的成功 我也尝试过一些选项,但它们有点过时,没有详细说明迁移问题 以下是我当前的设置:Django migrate在第二个数据库中创建了错误的表,django,database,django-models,Django,Database,Django Models,我想创建一个仅由Django项目中的第二个数据库使用的模型。所以理论上,我会有一个默认数据库,其中包含所有应用程序及其模型,然后这个新数据库将有一个单独的应用程序模型,这将是我的工作数据 我遇到的问题是,每当我迁移到新数据库时,它都会复制所有表,包括只打算在新数据库中的新表。所有原始内容类型、会话、身份验证等都将添加到此新的“作业”数据库中。我只希望Jobdata模型/表位于jobs数据库中 我已经检查了好几次了,但是我设置的路由器并没有太大的成功 我也尝试过一些选项,但它们有点过时,没有详细说
#models.py
#the new table/model that I want to go to a new separate database called jobs
class Jobdata(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
employer_name = models.CharField(max_length=50, blank=True)
empoyer_profile_id = models.CharField(max_length=50, blank=True)
#also in models.py
#the router class used to pick the right database
class JobDataRouter:
'''Used to tell Django which database must use the job data model'''
def db_for_read(self, model, **hints):
"""
Attempts to read Jobdata models go to jobs database.
"""
if model._meta.app_label == 'jobdata':
return 'jobs'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write Jobdata models go to jobs database.
"""
if model._meta.app_label == 'jobdata':
return 'jobs'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the jobdata app is involved.
"""
if obj1._meta.app_label == 'jobdata' or \
obj2._meta.app_label == 'jobdata':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the jobdata app only appears in the 'jobs'
database.
"""
if app_label == 'jobdata':
return db == 'jobs'
return None
#settings.py
DATABASE_ROUTERS = ['jobdata.models.JobDataRouter',]
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'django_live',
'USER': 'postgres',
'PASSWORD': os.environ.get('postgresuser'),
'HOST': '127.0.0.1',
'PORT': '5433',
},
'jobs': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'jobs',
'USER': 'postgres',
'PASSWORD': os.environ.get('postgresuser'),
'HOST': '127.0.0.1',
'PORT': '5433',
},
}
我设法让迁移将正确的模型应用到正确的数据库。如果其他人有这个问题,这就是我的工作: 我更改了我的数据库以使用空白默认值,然后我重命名了我的主数据库,在那里我想让常用的应用程序运行,例如用户、身份验证等。我称之为“主数据库”
#settings.py
DATABASE_ROUTERS = ['jobdata.models.JobRouter',]
DATABASES = {
'default': {},
'main': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'django_live',
'USER': 'postgres',
'PASSWORD': os.environ.get('postgresuser'),
'HOST': '127.0.0.1',
'PORT': '5433',
},
'jobs': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'jobs',
'USER': 'postgres',
'PASSWORD': os.environ.get('postgresuser'),
'HOST': '127.0.0.1',
'PORT': '5433',
},
}
'''
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
然后我改变了我的路由器,让它根据它所指的应用选择主数据库或作业数据库。Django文档展示了如何对auth或contenttype应用程序执行此操作,但我只想对包含我的作业数据模型的jobdata应用程序执行此操作。所以我改变了逻辑
#model.py I should probably put this file somewhere else, but documentation doesn't #specify
class JobRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {'jobdata'}
def db_for_read(self, model, **hints):
"""
Attempts to read jobdata models go to jobs database.
"""
if model._meta.app_label not in self.route_app_labels:
return 'main'
return 'jobs'
def db_for_write(self, model, **hints):
"""
Attempts to write jobdata models go to jobs database.
"""
if model._meta.app_label not in self.route_app_labels:
return 'main'
return 'jobs'
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the jobdata apps is
involved.
"""
if (
obj1._meta.app_label not in self.route_app_labels or
obj2._meta.app_label not in self.route_app_labels
):
return None
return True
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the jobdata apps only appear in the
'jobs' database.
"""
if app_label not in self.route_app_labels:
return db == 'main'
return 'jobs'
Django似乎不喜欢我先有一个默认表,然后是另一个新表。我成功地进行了迁移,以便将正确的模型应用到正确的数据库。如果其他人有这个问题,这就是我的工作: 我更改了我的数据库以使用空白默认值,然后我重命名了我的主数据库,在那里我想让常用的应用程序运行,例如用户、身份验证等。我称之为“主数据库”
#settings.py
DATABASE_ROUTERS = ['jobdata.models.JobRouter',]
DATABASES = {
'default': {},
'main': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'django_live',
'USER': 'postgres',
'PASSWORD': os.environ.get('postgresuser'),
'HOST': '127.0.0.1',
'PORT': '5433',
},
'jobs': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'jobs',
'USER': 'postgres',
'PASSWORD': os.environ.get('postgresuser'),
'HOST': '127.0.0.1',
'PORT': '5433',
},
}
'''
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
然后我改变了我的路由器,让它根据它所指的应用选择主数据库或作业数据库。Django文档展示了如何对auth或contenttype应用程序执行此操作,但我只想对包含我的作业数据模型的jobdata应用程序执行此操作。所以我改变了逻辑
#model.py I should probably put this file somewhere else, but documentation doesn't #specify
class JobRouter:
"""
A router to control all database operations on models in the
auth and contenttypes applications.
"""
route_app_labels = {'jobdata'}
def db_for_read(self, model, **hints):
"""
Attempts to read jobdata models go to jobs database.
"""
if model._meta.app_label not in self.route_app_labels:
return 'main'
return 'jobs'
def db_for_write(self, model, **hints):
"""
Attempts to write jobdata models go to jobs database.
"""
if model._meta.app_label not in self.route_app_labels:
return 'main'
return 'jobs'
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the jobdata apps is
involved.
"""
if (
obj1._meta.app_label not in self.route_app_labels or
obj2._meta.app_label not in self.route_app_labels
):
return None
return True
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the jobdata apps only appear in the
'jobs' database.
"""
if app_label not in self.route_app_labels:
return db == 'main'
return 'jobs'
Django似乎不喜欢我有一个默认表,然后是另一个新表