Django迁移外键与旧数据库不匹配

2024-09-27 23:28:20 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,大家好

我正在尝试将SQLite遗留数据库与Django v3.1.2集成,到目前为止,这非常痛苦(Django是新手,如果这是显而易见的,请道歉)。我假设我的数据库模式或迁移过程有问题。这就是我所做的和我的问题:

我已经在我的遗留数据库上运行了inspectdb,并清理了模型,留下了以下两个模型(我的应用程序中有更多的模型,但这些显然是导致问题的模型):

class Integrons(models.Model):
    arg = models.ForeignKey('Args', on_delete=models.CASCADE)
    int_id = models.IntegerField(primary_key=True)
    int_start = models.IntegerField()
    int_stop = models.IntegerField()
    int_complete = models.CharField(max_length=500)

    class Meta:
        managed = False
        db_table = 'integrons'

class IntElements(models.Model):
    int = models.ForeignKey('Integrons', on_delete=models.CASCADE)
    el_id = models.IntegerField()
    el_start = models.IntegerField()
    el_stop = models.IntegerField()
    el_name = models.CharField(blank=True, null=True, max_length=500)
    el_strand = models.CharField(blank=True, null=True, max_length=500)

    class Meta:
        managed = False
        db_table = 'int_elements'

我的旧版数据库中的相应字段为:

整数:参数id、整数id、整数开始、整数停止、整数完成 要素:国际标识、国际标识、国际起点、国际终点、国际名称、国际终点

如模型中所示,IntElements.int_id应该指integrarons.int_id

现在我正在尝试迁移所有内容-运行python manage.py makemigrations可以很好地工作。 但是,在运行python manage.py migrate时,出现以下错误:

django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table (foreign key mismatch - "int_elements" referencing "integrons")

我不明白问题出在哪里。第一次运行这个时,我认为问题在于我的模型顺序,因为我在models.py中定义了IntElements之前的Integrons。我更改了它,删除了迁移文件夹中的.pyc文件,并重复迁移过程,得到了相同的错误。当我删除迁移文件并注释掉models.py中的IntElements模型并运行makemigrations时,我看到除了IntElements之外的所有模型都被创建了。但是当我运行python manage.py migrate时,我得到了相同的错误,这使我相信迁移过程中出现了一些问题。或者可能是我列名中的_id

我真的很感激在这方面的任何帮助

编辑<

python manage.py showmigrations

输出

    python manage.py showmigrations
System check identified some issues:

WARNINGS:
db_app.Lineages.taxon: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
    HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
admin
 [ ] 0001_initial
 [ ] 0002_logentry_remove_auto_add
 [ ] 0003_logentry_add_action_flag_choices
auth
 [ ] 0001_initial
 [ ] 0002_alter_permission_name_max_length
 [ ] 0003_alter_user_email_max_length
 [ ] 0004_alter_user_username_opts
 [ ] 0005_alter_user_last_login_null
 [ ] 0006_require_contenttypes_0002
 [ ] 0007_alter_validators_add_error_messages
 [ ] 0008_alter_user_username_max_length
 [ ] 0009_alter_user_last_name_max_length
 [ ] 0010_alter_group_name_max_length
 [ ] 0011_update_proxy_permissions
 [ ] 0012_alter_user_first_name_max_length
contenttypes
 [ ] 0001_initial
 [ ] 0002_remove_content_type_name
db_app
 [ ] 0001_initial
sessions
 [ ] 0001_initial

Tags: namepy模型idtruedbmodelslength
1条回答
网友
1楼 · 发布于 2024-09-27 23:28:20

这里有些问题,因为非托管模型do not create migrations

By default, inspectdb creates unmanaged models. That is, managed = False in the model’s Meta class tells Django not to manage each table’s creation, modification, and deletion

[code sample cut]

If you do want to allow Django to manage the table’s lifecycle, you’ll need to change the managed option above to True (or remove it because True is its default value).

这是有意为之的,因为遗留数据库最突出的情况是提供正在逐步淘汰的信息的只读数据库。使用Django来管理它们会破坏遗留应用程序,如果为模式操作设置了适当的权限,甚至可能无法实现

您还提到,正在创建的表再次与非托管表冲突

如果您的目标是导入模式,然后删除SQLite数据库并让Django正确填充和管理它,那么您必须通过从模型元类中删除managed = False来管理模型。这是另一种常见的使用情况,在这种情况下,您继承一个数据库,并希望从该数据库开始,然后使用迁移框架继续前进。Inspectdb是一个一次性命令,用于将样板文件准备就绪

相关问题 更多 >

    热门问题