gpt4 book ai didi

具有多个数据库的 Django 迁移

转载 作者:行者123 更新时间:2023-12-01 22:50:30 30 4
gpt4 key购买 nike

我在创建数据迁移方面遇到了困难。我的应用程序使用两个数据库。我在 settings.py 中配置了数据库,并创建了一个像 Django docs 中一样的路由器.

# settings.py
DB_HOST = 'localhost'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'helios',
'HOST': DB_HOST,
'OPTIONS': {
'read_default_file': join(dirname(__file__), 'default.cnf'),
},
},
'other': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'gala_pol',
'HOST': DB_HOST,
'OPTIONS': {
'read_default_file': join(dirname(__file__), 'other.cnf'),
},
},

DATABASE_APPS_MAPPING = {
'contenttypes': 'default',
'auth': 'default',
'admin': 'default',
'sessions': 'default',
'messages': 'default',
'staticfiles': 'default',
'woodsmen': 'default',
'helios': 'default',
'hush': 'default',
'hunt': 'other',
'meat': 'other',
'beast': 'other',
}

# routers.py

class DatabaseAppsRouter(object):

def db_for_read(self, model, **hints):

if model._meta.app_label in settings.DATABASE_APPS_MAPPING:
return settings.DATABASE_APPS_MAPPING[model._meta.app_label]
return None

def db_for_write(self, model, **hints):

if model._meta.app_label in settings.
return settings.DATABASE_APPS_MAPPING[model._meta.app_label]
return None

def allow_relation(self, obj1, obj2, **hints):

db1 = settings.DATABASE_APPS_MAPPING.get(obj1._meta.app_label)
db2 = settings.DATABASE_APPS_MAPPING.get(obj2._meta.app_label)
if db1 and db2:
return db1 == db2
return None

def allow_migrate(self, db, app_label, model_name=None, **hints):

if db in settings.DATABASE_APPS_MAPPING.values():
return settings.DATABASE_APPS_MAPPING.get(app_label) == db
elif app_label in settings.DATABASE_APPS_MAPPING:
return False

以下是其中一个应用程序的模型和迁移:

# hunt.models.py

class Dish(models.Model):
"""
Investigation case
"""
display_name = models.CharField(max_length=64, unique=True)
department = models.ForeignKey(Kitchen, null=True)
case_type = models.PositiveSmallIntegerField(choices=CASE_TYPE_CHOICES, default=DEF_CASE_TYPE)
created_at = models.DateTimeField(blank=True, null=True)
comment = models.CharField(max_length=256, blank=True, null=True)

class Meta:
verbose_name = 'case'
app_label = 'hunt'

def __unicode__(self):
return (u'%s (%s)' % (self.display_name, self.created_at)).strip()


# hunt.migrations.0001_initial.py

class Migration(migrations.Migration):

app_label = 'hunt'

dependencies = [
]

operations = [
migrations.CreateModel(
name='Dish',
fields=[
('id', models.AutoField(verbose_name='ID', auto_created=True, primary_key=True, serialize=False)),
('display_name', models.CharField(max_length=64, unique=True)),
('case_type', models.PositiveSmallIntegerField(default=0, choices=[(0, 'Unknown'), (1, 'General'), (2, 'Terror'), (3, 'Narco'), (4, 'Fraud'), (5, 'Slavery'), (6, 'Traffic'), (7, 'RICO'), (8, 'War'), (9, 'Cyber'), (20, 'Other')])),
('created_at', models.DateTimeField(null=True, blank=True)),
('comment', models.CharField(max_length=256, null=True, blank=True)),
],
options={
'verbose_name': 'case',
},
),
]

# hunt.migrations.0002_add_hunts.py


def create_initial_hunts(apps, schema_editor):

if settings.DEBUG:
print('\nContent added')


class Migration(migrations.Migration):
dependencies = [
('hunt', '0001_initial'),
]


operations = [
migrations.RunPython(create_initial_hunts, hints={'schema_editor': 'other'}),
]

问题是: 当我运行“迁移”命令时,仅迁移连接到默认数据库的应用程序。其余应用程序中的迁移永远不会运行。如果我使用 --database 选项启动此类应用程序的迁移 - 它工作正常。

如何指定每次迁移的数据库?路由器不应该专门管理这个吗?或者我错过了什么?

最佳答案

have to对每个数据库运行一次migrate,并使用--database指定目标。每次它都会咨询您的路由器以查看在该数据库上实际执行哪些迁移。

我猜它的设计方式是为了支持明确而不是隐含。例如,您的工作流程可能需要您在不同时间迁移不同的数据库。

但请注意,您无法从输出中判断实际执行了哪些迁移,since :

If allow_migrate() returns False, any migration operations for the model_name will be silently skipped when running migrate on the db.

关于具有多个数据库的 Django 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35609509/

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