您好,登錄后才能下訂單哦!
這篇文章主要介紹了Django模型修改及數據遷移的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
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。
添加字段
在你的模型里添加字段。下例向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;
添加 非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;
刪除模型
刪除數據表即可
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
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Django模型修改及數據遷移的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。