为什么 Django migrate 命令不为特定应用程序在数据库中创建表?

问题描述 投票:0回答:2

我有一个名为 attendance 的应用程序,它包含在 数据库中应用的以下迁移。

attendance
 [X] 0001_initial
 [X] 0002_delete_leave
 [X] 0003_alter_holiday_options_alter_shift_options
 [X] 0004_delete_holiday_alter_shift_holidays
 [X] 0005_delete_shift
 [X] 0006_initial
 [X] 0007_alter_leave_options
 [X] 0008_alter_leave_comment_alter_leave_is_regularized
 [X] 0009_attendance
 [X] 0010_alter_attendance_options_attendance_created_at_and_more
 [X] 0011_attendance_status
 [X] 0012_attendance_is_regularized
 [X] 0013_alter_attendance_is_regularized
 [X] 0014_remove_attendance_date_attendance_start_date_and_more
 [X] 0015_attendance_end_date
 [X] 0016_alter_attendance_end_date
 [X] 0017_alter_attendance_end_date_and_more
 [X] 0018_leavetype_remove_leave_half_day_and_more
 [X] 0019_leave_leave_type

当我运行带有或不带有应用程序标签的

python manage.py migrate
时,它不会在数据库中创建表。

我还没有设置

managed=False
并尝试从
django_migrations
表中删除所有迁移,但没有成功。

还有一点我忘了补充一点,我正在使用 django-tenants

更新

为了调试该问题,我删除了本地数据库并保留了迁移。在迁移之前,我使用

--plan
标志运行迁移命令

python manage.py migrate --plan

上面的命令给了我这个错误

[standard:public]     Change Meta options on todo
[standard:public] todo_task.0004_todo_created_at_todo_updated_at

[standard:public]     Add field created_at to todo
[standard:public]     Add field updated_at to todo
Traceback (most recent call last):
  File "env\lib\site-packages\django\db\backends\utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "tenant_tenant" does not exist
LINE 1: SELECT "tenant_tenant"."schema_name" FROM "tenant_tenant" WH...

...

python django django-models django-migrations django-tenants
2个回答
0
投票

希望这有帮助〜

您可以使用此命令重置到上次已知的迁移

python manage.py migrate app_name migration_name

例如:

python manage.py migrate myapp 0001

然后运行迁移命令:

python manage.py migrate app_name 

如果这不起作用,您可以使用 --fake 标志来操纵当前的迁移状态。

python manage.py migrate --fake myapp 0001

这适用于更有经验的用户。请在这里查看更多内容https://docs.djangoproject.com/en/dev/ref/django-admin/#migrate


0
投票

根据文档,我发现了问题。我们希望将其表放在公共模式中的所有应用程序,我们必须将它们添加到

SHARED_APPS

所以我在

attendance
中添加了task
SHARED_APPS
应用程序。

SHARED_APPS = (
    'django_tenants',  # mandatory
    'attendance',
    'task',
    'django.contrib.contenttypes',

    # everything below here is optional
    'django.contrib.auth',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',
)

此后,我删除了本地数据库,创建了一个新数据库,然后运行了迁移命令。

python manage.py migrate

成功了!

感谢所有试图帮助我的人(:

© www.soinside.com 2019 - 2024. All rights reserved.