python - Django编写数据库迁移转发功能问题
问题描述
我正在尝试将自定义迁移添加到 django 应用程序。我希望自定义迁移不适用于“默认”数据库,而另一个自定义迁移仅适用于“默认”数据库。我应用了 django 文档中建议的方法,但迁移命令从未奏效。我该如何解决这个问题?感谢您的帮助。
Django 文档页面: https ://docs.djangoproject.com/en/2.2/howto/writing-migrations/
我的代码(0001_initial.py,仅适用于“默认”数据库):
from django.db import migrations, models
def forwards(apps, schema_editor):
if schema_editor.connection.alias == 'default':
migrations.CreateModel(
name='Planets',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('description', models.TextField(blank=True)),
],
),
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.RunPython(forwards),
]
其他迁移(仅适用于非“默认”数据库):
from django.db import migrations, models
def forwards(apps, schema_editor):
if schema_editor.connection.alias != 'default':
migrations.CreateModel(
name='data_sources',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sql_query', models.TextField(default='')),
],
),
migrations.CreateModel(
name='query_history',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('query', models.TextField()),
('date', models.DateField(auto_now_add=True)),
],
),
class Migration(migrations.Migration):
dependencies = [
('universe','0001_initial')
]
operations = [
migrations.RunPython(forwards),
]
解决方案
经过一天的努力,我找到了解决方案。我不再将 Django 迁移系统用于新的动态数据库。而不是这个,我使用 Django SchemaEditor。create_model() 方法可以从任何模型自动创建数据库表。
SchemaEditor:https ://docs.djangoproject.com/en/2.2/ref/schema-editor/
如果要将 SchemaEditor 用于非默认数据库,则必须使用连接模块。例如:
from django.db import connections
with connections['connection_alias'].schema_editor() as schema_editor:
schema_editor.create_model(any model)
另一方面,如果您不希望 django 从模型创建迁移,则必须在模型中将 managed 设置为 False。例如:
class Objects(models.Model):
class Meta:
managed = False
现在,之后
manage.py makemigrations
命令,django 为这个模型创建迁移文件(不用担心),但它永远不会在数据库中为这个模型创建任何表。
推荐阅读
- indexing - mariadb 没有使用复合索引的所有字段
- java - arraylist 用什么代替 charAt
- swift - 在终端中为另一个应用程序编写一些代码时应用程序的互联网连接丢失
- sockets - 基于clientIP的sessionAffinity不为TCP请求后的新UDP请求维护
- windows - 使用 Powershell 以方便的格式列出系统信息
- ssl - FIPS 模式与 NON-FIPS 模式下密码套件列表的差异
- ubuntu - 尝试通过substrate-front-end-template访问Substrate节点错误{“isTrusted”:true}
- google-sheets - Google Sheet 将 ArrayFormula 与 textjoin 结合使用
- html - HTML 未与 Hugo 中的 CSS 链接
- jdbc - 为复合行实现 SQLData 接口