FTM*_*FTM 2 django django-postgresql django-migrations
我的ali项目()上有一个应用()website,我希望它具有自己的数据库。问题是,当我运行时python manage.py migrate --database=ali,该命令将重新创建ali数据库中的所有表。而预期的结果将是仅拥有ali_search数据库。
PS:我运行了一些测试后,该应用程序似乎正在按预期运行。换句话说,我的ali应用程序中的模型已保存在ali数据库中。尽管如此,将所有这些空表放在我的ali数据库中仍然不是正确的方法。
设定:
# website.settings
...
INSTALLED_APPS = [
'base.apps.BaseConfig',
'ali.apps.AliConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.sites',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sitemaps',
'django_comments',
'mptt',
'tagging',
'zinnia',
]
....
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'website',
'USER': 'website',
'PASSWORD': 'website',
'HOST': 'localhost',
'PORT': '5432',
},
'ali': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'ali',
'USER': 'ali',
'PASSWORD': 'ali',
'HOST': 'localhost',
'PORT': '5432',
}
}
DATABASE_ROUTERS = [
'ali.routers.AliRouter',
]
....
Run Code Online (Sandbox Code Playgroud)
路由器:
# ali.routers
class AliRouter:
def db_for_read(self, model, **hints):
if model._meta.app_label == 'ali':
return 'ali'
return None
def db_for_write(self, model, **hints):
if model._meta.app_label == 'ali':
return 'ali'
return None
def allow_relation(self, obj1, obj2, **hints):
if obj1._meta.app_label == 'ali' or \
obj2._meta.app_label == 'ali':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'ali':
return db == 'ali'
return None
Run Code Online (Sandbox Code Playgroud)
模型:
# ali.models
from django.db import models
class Search(models.Model):
results = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
这是我通过查询ali数据库获得的\dt:
ali=# \dt
List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+-------
public | ali_search | table | ali
public | auth_group | table | ali
public | auth_group_permissions | table | ali
public | auth_permission | table | ali
public | auth_user | table | ali
public | auth_user_groups | table | ali
public | auth_user_user_permissions | table | ali
public | django_admin_log | table | ali
public | django_comment_flags | table | ali
public | django_comments | table | ali
public | django_content_type | table | ali
public | django_migrations | table | ali
public | django_session | table | ali
public | django_site | table | ali
public | tagging_tag | table | ali
public | tagging_taggeditem | table | ali
public | zinnia_category | table | ali
public | zinnia_entry | table | ali
public | zinnia_entry_authors | table | ali
public | zinnia_entry_categories | table | ali
public | zinnia_entry_related | table | ali
public | zinnia_entry_sites | table | ali
(22 rows)
Run Code Online (Sandbox Code Playgroud)
但是我真正期望的是:
ali=# \dt
List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+-------
public | ali_search | table | ali
(1 row)
Run Code Online (Sandbox Code Playgroud)
该应用程序与数据库具有相同的名称(在本例中为ali)是否会成为问题?
None从返回allow_migrate()意味着路由器对当前操作没有意见。如果所有配置的路由器都没有意见,则默认为允许该操作。您当前的路由器返回以外None的应用程序ali,因此两个数据库都允许进行这些操作。
要禁止在ali数据库上迁移其他应用程序,False在这些情况下,您必须显式返回,例如:
def allow_migrate(self, db, app_label, model_name=None, **hints):
if app_label == 'ali':
return db == 'ali'
return db == 'default'
Run Code Online (Sandbox Code Playgroud)
现在,您只需migrate为每个数据库运行,而无需指定要迁移的应用程序:
$ python manage.py migrate --database=default
$ python manage.py migrate --database=ali
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |