国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Django模型修改及數據遷移

2019-11-14 17:30:01
字體:
來源:轉載
供稿:網友

Migrations

Django中對Model進行修改是件麻煩的事情,syncdb命令僅僅創建數據庫里還沒有的表,它并不對已存在的數據表進行同步修改,也不處理數據模型的刪除。 如果你新增或修改數據模型里的字段,或是刪除了一個數據模型,你需要手動在數據庫里進行相應的修改或者使用South。Django 1.7中已經集成了South的代碼,提供了3個新命令:

  • migrate: 用于執行遷移動作,具有syncdb的功能
  • makemigrations: 基于當前的model創建新的遷移策略文件
  • sqlmigrate: 顯示遷移的SQL語句,具有sqlall的功能

使用起來很簡單,對Model做了修改后,使用makemigrations記錄修改:

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

你的Model會被掃描, 然后與migrations文件夾中以前的版本作比較, 然后生成本次遷移文件。

有了新的migration文件,就可以使用migrate修改數據庫模式:

$ python manage.py migrateOperations to perform:  Synchronize unmigrated apps: sessions, admin, messages, auth, staticfiles, contenttypes  Apply all migrations: booksSynchronizing 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, migrationsclass Migration(migrations.Migration):    dependencies = [        ('yourappname', '0001_initial'),    ]    operations = [    ]

如果想修改某個Model例如Person的數據,設置其name字段:

# -*- coding: utf-8 -*-from django.db import models, migrationsdef 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;ALTER TABLE books_book ALTER COLUMN num_pages SET NOT NULL;COMMIT;

添加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;

刪除模型

刪除數據表即可

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

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿合奇县| 新沂市| 崇州市| 永昌县| 南皮县| 济阳县| 临朐县| 永胜县| 弋阳县| 黔东| 唐河县| 阿勒泰市| 韶关市| 东乌珠穆沁旗| 保靖县| 富顺县| 福安市| 吉水县| 伊春市| 乌兰察布市| 咸阳市| 苍梧县| 凤阳县| 平利县| 元阳县| 沈阳市| 奉贤区| 樟树市| 莲花县| 湖口县| 石城县| 阳信县| 梧州市| 铁岭市| 平顺县| 山阳县| 伊春市| 铜梁县| 临城县| 松阳县| 班戈县|