石墨烯代码在 Django 数据迁移之前运行
Posted
技术标签:
【中文标题】石墨烯代码在 Django 数据迁移之前运行【英文标题】:graphene code run before django data migrations 【发布时间】:2021-12-01 10:20:11 【问题描述】:我写了一段代码,从数据库中动态生成石墨烯输入对象类型。当我尝试运行时
./manage.py migrate
该代码在迁移之前运行并导致
django.db.utils.ProgrammingError
我在运行 Pytest 时也遇到了同样的问题。 如何防止此代码在数据迁移之前运行
【问题讨论】:
【参考方案1】:我在 pytest django GitHub issue 上找到了这段代码,用于解除 py 测试挂钩中的数据库限制。
import pytest
from pytest_django.plugin import _blocking_manager
from django.db.backends.base.base import BaseDatabaseWrapper
@pytest.hookimpl(tryfirst=True)
def pytest_load_initial_conftests(early_config, parser, args):
_blocking_manager.unblock()
_blocking_manager._blocking_wrapper = BaseDatabaseWrapper.ensure_connection
并在 pytest.ini 中使用 -p 参数调用这个钩子
【讨论】:
【参考方案2】:这似乎不是 pytest 的问题,因为您也面临着正常迁移的问题。我们可以查看您的迁移/数据迁移文件吗?通常在建表之后进行数据迁移。
import django.db.models.deletion
from django.db import migrations, models
def populate_document_owners(apps, schema_editor):
Document = apps.get_model('some_schema', 'Document')
User = apps.get_model('some_schema', 'User')
owner_of_all_docs = User.objects.first()
for d in Document.objects.all():
d.user = owner_of_all_docs
d.save()
class Migration(migrations.Migration):
dependencies = [
('some_schema', '0100_previous_migration'),
]
operations = [
migrations.AddField(
model_name='document',
name='owner',
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name='documents',
to='some_schema.user',
),
),
migrations.RunPython(populate_document_owners),
]
【讨论】:
以上是关于石墨烯代码在 Django 数据迁移之前运行的主要内容,如果未能解决你的问题,请参考以下文章