sqliteDjango模型修改和数量迁移

Migrations

Django中对Model进行改动是桩劳动的工作,syncdb命令仅仅创建数据库里还并未底阐发,它并无针对就在的数据表进行协同修改,也无处理数据模型的删除。
如果您新增或涂改数据模型里的字段,或是删除了一个数据模型,你得手动在数据库里开展相应的改动或应用South。Django
1.7饱受早已合龙了South的代码,提供了3单新命令:

  • migrate: 用于行迁移动作,具有syncdb的职能
  • makemigrations: 基于目前之model创建新的动迁政策文件
  • sqlmigrate: 显示迁移的SQL语句,具有sqlall的力量

运用起来颇简单,对Model做了改动后,使用makemigrations记录修改:

$ python manage.py makemigrations
Migrations for 'books':
  0003_auto.py:
    - Alter field author on book

卿的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

也得以对单身的app生成migration:

$ python manage.py makemigrations your_app_label

啊足以针对数据库中之数目进行修改,首先建立一个缺损的migration文件:

python manage.py makemigrations --empty yourappname

文件的内容如下:

# -*- coding: utf-8 -*-
from django.db import models, migrations

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
    ]

使想修改某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即可。这样Person中的所有对象的name字段都设置好了。

根据Model修改关系数据库是开发中之一个第一之题目,解决此问题可提升开发进度,不过只要于生条件面临任动用migrate操作数据库还是老惊险的,有时候用手动修改数据库。

手动修改数据库

当处理模型修改的当儿:

  • 要是模型包含一个没在数据库里建之字段,Django会报出错信息。
    当你首先破用Django的数据库API请求表中莫设有的字段时会导致错误。

  • Django不关心数据库表中是否在不当模型中定义的排。

  • Django不关心数据库被是不是留存不被模型表示的table。

补偿加字段

  1. 于公的范里补充加字段。下例向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 
    

  1. 运行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
    );
    

  1. 被您的数据库的互命令界面(比如,psql或者mysql,或者好使manage.py
    dbshell。 执行ALTER TABLE语句子来补偿加新列。

    ALTER TABLE books_book ADD COLUMN num_pages integer;  
    

添加 非NULL 字段

优先创造 NULL
型的字段,然后以欠字段的值填充为某个默认值,然后又用该字段改吧 NOT NULL

BEGIN;
ALTER TABLE books_book ADD COLUMN num_pages integer;
UPDATE books_book SET num_pages=0;
UPDATE books_book SET num_pages = NULL;
COMMIT;

或者

ALTER TABLE <YourTable> ADD <NewColumn> <NewColumnType> NOT NULL DEFAULT <DefaultValue>;

添加ForeignKey或ManyToManyField

长外键即凡是补偿加key_id的integer字段,添加多对多字段是开创一个初的数据表。

删去字段

比较简单,将表中的某列删掉即可

ALTER TABLE books_book DROP COLUMN num_pages;

动sqlite3时,会略带累,sqlite3不支持删除列操作,只有少数地 ALTER
TABLE 支持。你得应用她来以表的终极增加一排列,可另行改表的名。
如果欲对表结构做重新扑朔迷离的改动,则必须重新建表。重建时得以预先将曾经在的数码放到一个临时表中,删除原表,
创建新表,然后用数据由临时表中复制回来。

如若,假设有一个 t1 表,其中有 “a”, “b”, “c” 三列, 如果要去列 c :

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

删去多针对性大多涉及字段

删掉多针对多关系的数据表即可

DROP TABLE books_book_authors;

sqlite剔除模型

剔除数据表即可

DROP TABLE books_book;

数迁移

django 项目提供了一个导出的法 python manage.py dumpdata, 不指定
appname 时默认为导出所有的app

python manage.py dumpdata myapp > myapp.json

导出的文本内容格式:

[
  {
    "model": "myapp.person",
    "pk": 1,
    "fields": {
      "first_name": "John",
      "last_name": "Lennon"
    }
  },
  {
    "model": "myapp.person",
    "pk": 2,
    "fields": {
      "first_name": "Paul",
      "last_name": "McCartney"
    }
  }
]

数导入:

python manage.py loaddata myapp.json

导出用户数量:

python manage.py dumpdata auth > auth.json

  

网站地图xml地图