Django 迁移不会更改 AWS Elastic Beanstalk 中的数据库
Django migration is not changing database in AWS Elastic Beanstalk
我已经使用 AWS Elastic Beanstalk 部署了我的 Djnago 应用程序。我添加了一些数据,一切正常。然后我在model.py中增加了其中一个CharField的max_length。我已经使用 'eb deploy' 命令再次部署了该应用程序。但它并没有增加数据库中的字段长度。如果我尝试添加大于 10 的 subject_id,我会收到此错误:django.db.utils.DataError: value too long for type character varying(10)
Model.py:
class Subject(models.Model):
#subject_id = models.CharField(max_length=10, blank=True)
subject_id = models.CharField(max_length=50, blank=True)
0001_initial.py:
#Generated by Django 3.0.4 on 2021-02-18 18:54
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('accounts', '0001_initial'),]
operations = [
migrations.CreateModel(
name='Subject',
fields=[('subject_id', models.CharField(blank=True, max_length=50)),],),]
我在.ebextensions/django_build.config 文件中添加了迁移命令。迁移文件夹中的 0001_initial.py 文件显示了更改。但它没有在数据库(AWS RDS postgresql)中更新。我检查了 postgresql 数据库中的 django_migrations table 。它显示了我第一次创建实例时发生的最后一次迁移。
我需要更改 subject_id 现有数据库中主题模型的字段长度。任何帮助将不胜感激。
.ebextensions/django_build.config:
container_commands:
01_create_log_folder:
command: "mkdir -p log && chown webapp:webapp -R log"
02_source_env:
command: "source /etc/profile.d/sh.local"
leader_only: true
03_database_migrations:
command: "source /var/app/venv/*/bin/activate && python3 manage.py makemigrations --noinput && python3 manage.py migrate --noinput && deactivate"
leader_only: true
django_migrations table:
select * from django_migrations;
id | app | name | applied
----+-----------------+------------------------------------------+-----------------------
28 | fileupload | 0001_initial | 2021-01-22 11:42:40.726471+00
由于您修改后的迁移与您已经应用的迁移同名 (0001_initial
),因此它没有被执行。您需要:
- 创建一个新的迁移 (
0002_new_migration
) 来改变您在第一个迁移中创建的字段
或
- 首先回滚您的迁移,然后应用修改后的迁移
要回滚您的迁移,您需要通过 SSH 连接到 ELB 实例:
Login via SSH - check your AWS console for specific instructions
然后运行以下重置accounts
迁移
source /opt/python/run/venv/bin/activate
source /opt/python/current/env
cd /opt/python/current/app
./manage.py migrate accounts zero
下次部署时,您将从头开始 accounts
模型,您的新迁移将 运行。
这与使用 manage.py
和 migrate
在本地反向迁移没有什么不同,只是您是在远程实例上进行的。
我已经使用 AWS Elastic Beanstalk 部署了我的 Djnago 应用程序。我添加了一些数据,一切正常。然后我在model.py中增加了其中一个CharField的max_length。我已经使用 'eb deploy' 命令再次部署了该应用程序。但它并没有增加数据库中的字段长度。如果我尝试添加大于 10 的 subject_id,我会收到此错误:django.db.utils.DataError: value too long for type character varying(10)
Model.py:
class Subject(models.Model):
#subject_id = models.CharField(max_length=10, blank=True)
subject_id = models.CharField(max_length=50, blank=True)
0001_initial.py:
#Generated by Django 3.0.4 on 2021-02-18 18:54
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('accounts', '0001_initial'),]
operations = [
migrations.CreateModel(
name='Subject',
fields=[('subject_id', models.CharField(blank=True, max_length=50)),],),]
我在.ebextensions/django_build.config 文件中添加了迁移命令。迁移文件夹中的 0001_initial.py 文件显示了更改。但它没有在数据库(AWS RDS postgresql)中更新。我检查了 postgresql 数据库中的 django_migrations table 。它显示了我第一次创建实例时发生的最后一次迁移。
我需要更改 subject_id 现有数据库中主题模型的字段长度。任何帮助将不胜感激。
.ebextensions/django_build.config:
container_commands:
01_create_log_folder:
command: "mkdir -p log && chown webapp:webapp -R log"
02_source_env:
command: "source /etc/profile.d/sh.local"
leader_only: true
03_database_migrations:
command: "source /var/app/venv/*/bin/activate && python3 manage.py makemigrations --noinput && python3 manage.py migrate --noinput && deactivate"
leader_only: true
django_migrations table:
select * from django_migrations;
id | app | name | applied
----+-----------------+------------------------------------------+-----------------------
28 | fileupload | 0001_initial | 2021-01-22 11:42:40.726471+00
由于您修改后的迁移与您已经应用的迁移同名 (0001_initial
),因此它没有被执行。您需要:
- 创建一个新的迁移 (
0002_new_migration
) 来改变您在第一个迁移中创建的字段
或
- 首先回滚您的迁移,然后应用修改后的迁移
要回滚您的迁移,您需要通过 SSH 连接到 ELB 实例:
Login via SSH - check your AWS console for specific instructions
然后运行以下重置accounts
迁移
source /opt/python/run/venv/bin/activate
source /opt/python/current/env
cd /opt/python/current/app
./manage.py migrate accounts zero
下次部署时,您将从头开始 accounts
模型,您的新迁移将 运行。
这与使用 manage.py
和 migrate
在本地反向迁移没有什么不同,只是您是在远程实例上进行的。