Django模型修改及数据迁移

8 篇文章 0 订阅
3 篇文章 0 订阅

参考:https://www.cnblogs.com/linxiyue/p/4106514.html

激活模型

为这个应用创建数据库 schema(生成 CREATE TABLE 语句)。
创建可以与 Question 和 Choice 对象进行交互的 Python 数据库 API。
但是首先得把 polls 应用安装到我们的项目里。

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
  1. migrate: 用于执行迁移动作,具有syncdb的功能
  2. makemigrations: 基于当前的model创建新的迁移策略文件
  3. sqlmigrate: 显示迁移的SQL语句,具有sqlall的功能
    使用起来很简单,对Model做了修改后,使用makemigrations记录修改:
$ python manage.py makemigrations
Migrations for 'books':
  0003_auto.py:
    - Alter field author on book

makemigrations

通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。

你的Model会被扫描, 然后与migrations文件夹中以前的版本作比较, 然后生成本次迁移文件。

有了新的migration文件,就可以使用migrate修改数据库模式:

$ python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: sessions, admin, messages, auth, staticfiles, contenttypes
  Apply all migrations: books
Synchronizing apps without migrations:
  Creating tables...
  Installing custom SQL...
  Installing indexes...
Installed 0 object(s) from 0 fixture(s)
Running migrations:
  Applying books.0003_auto... OK

migrate

  1. django-admin migrate [app_label] [migration_name]¶ 将数据库状态与当前模型和迁移集同步。迁移,迁移文档与应用程序的关系以及更多内容在迁移文档中进行 了详细介绍。

  2. 无参数:所有应用程序均运行所有迁移。 <app_label>:指定的应用程序一直在运行其迁移,直到最近的迁移为止。由于依赖关系,这可能还涉及运行其他应用程序的迁移。 <app_label> :将数据库架构置于已应用命名迁移的状态,但不应用同一应用程序中的更高版本的迁移。如果您先前已迁移过指定的迁移,则可能涉及取消应用迁移。您可以使用迁移名称的前缀,例如0001,只要它对于给定的应用程序名称是唯一的即可。使用该名称zero可以一路迁移,即还原应用程序的所有已应用迁移。 警告

  3. –database DATABASE¶ 指定要迁移的数据库。默认为default。

  4. –fake¶ 将迁移标记为已应用至目标迁移(遵循上述规则),但未实际运行SQL来更改数据库架构。

  5. –fake-initial¶ 如果使用该CreateModel迁移中所有操作创建的所有模型的所有数据库表均已存在,则允许Django跳过应用程序的初始迁移 。此选项适用于首次对已预先使用迁移的数据库运行迁移时使用。但是,此选项不会检查匹配表名称之外的匹配数据库模式,因此只有在确信现有模式与初始迁移中记录的内容匹配时,才可以安全使用。

  6. –plan¶ 显示将为给定migrate 命令执行的迁移操作

$ python manage.py makemigrations app_label

也可以对数据库中的数据进行修改,首先建立一个空的migration文件:

python manage.py makemigrations --empty appname

文件的内容如下:

# -*- coding: utf-8 -*-
from django.db import models, migrations
 
class Migration(migrations.Migration):
 
    dependencies = [
        ('appname', '0001_initial'),
    ]
 
    operations = [
    ]

这个 migrate 命令选中所有还没有执行过的迁移(Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移)并应用在数据库上 - 也就是将你对模型的更改同步到数据库结构上。

迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 - 它专注于使数据库平滑升级而不会丢失数据。我们会在后面的教程中更加深入的学习这部分内容,现在,你只需要记住,改变模型需要这三步:

编辑 models.py 文件,改变模型。
运行 python manage.py makemigrations 为模型的改变生成迁移文件。
运行 python manage.py migrate 来应用数据库迁移。

手动修改字段

如果想修改某个Model例如Person的数据,设置其name字段:

# -*- coding: utf-8 -*-
from django.db import models, migrations
 
def combine_names(apps, schema_editor):
    # We can't import the Person model directly as it may be a newer
    # version than this migration expects. We use the historical version.
    Person = apps.get_model("yourappname", "Person")
    for person in Person.objects.all():
        person.name = "%s %s" % (person.first_name, person.last_name)
        person.save()
 
class Migration(migrations.Migration):
 
    dependencies = [
        ('yourappname', '0001_initial'),
    ]
 
    operations = [
        migrations.RunPython(combine_names),
    ]
python manage.py migrate

依据Model修改关系数据库是开发中的一个重要的问题,解决这个问题可以提升开发速度,不过要在生产环境中随便使用migrate操作数据库还是很危险的,有时候需要手动修改数据库。

手动修改数据库
当处理模型修改的时候:

如果模型包含一个未曾在数据库里建立的字段,Django会报出错信息。 当你第一次用Django的数据库API请求表中不存在的字段时会导致错误。

  1. Django不关心数据库表中是否存在未在模型中定义的列。
  2. Django不关心数据库中是否存在未被模型表示的table。
    添加字段

在你的模型里添加字段。下例向Book模型添加num_pages字段:

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    **num_pages = models.IntegerField(blank=True, null=True)**
 
    def __unicode__(self):
        return self.title 

运行manage.py sqlall yourappname来测试模型新的CREATE TABLE语句。

CREATE TABLE "books_book" (
    "id" serial NOT NULL PRIMARY KEY,
    "title" varchar(100) NOT NULL,
    "publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id"),
    "publication_date" date NOT NULL,
    "num_pages" integer NULL
);

开启你的数据库的交互命令界面(比如,psql或者mysql,或者可以使用manage.py dbshell。 执行ALTER TABLE语句来添加新列。

ALTER TABLE books_book ADD COLUMN num_pages integer;  

总结

1,一般情况下能手动修改数据的就手动修改数据,但一定要保证数据库和model同步
,小概率会发生er图失效
2.如果迁移或者同步数据中出现了问题,一定要把django_migrations中对应的app的纪录和对应的0001_initial文件删除,才能重新删除

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值