Django模型修改及資料遷移

2021-09-24 03:47:20 字數 3493 閱讀 4293

migrations

django中對model進行修改是件麻煩的事情,syncdb命令僅僅建立資料庫裡還沒有的表,它並不對已存在的資料表進行同步修改,也不處理資料模型的刪除。 如果你新增或修改資料模型裡的字段,或是刪除了乙個資料模型,你需要手動在資料庫裡進行相應的修改或者使用south。django 1.7中已經整合了south的**,提供了3個新命令:

migrate: 用於執行遷移動作,具有syncdb的功能

makemigrations: 基於當前的model建立新的遷移策略檔案

sqlmigrate: 顯示遷移的sql語句,具有sqlall的功能

使用起來很簡單,對model做了修改後,使用makemigrations記錄修改:12

34$ python manage.py makemigrations

migrations for 『books』:

0003_auto.py:

- alter field author on book

你的model會被掃瞄, 然後與migrations資料夾中以前的版本作比較, 然後生成本次遷移檔案。

有了新的migration檔案,就可以使用migrate修改資料庫模式:12

3456

78910

11from django.db import models, migrations

class migration(migrations.migration):

dependencies = [

]operations = [

]

如果想修改某個model例如person的資料,設定其name欄位:12

3456

78910

1112

1314

1516

1718

1920

from django.db import models, migrations

class migration(migrations.migration):

dependencies = [

]operations = [

migrations.runpython(combine_names),

]

最後執行 python manage.py migrate即可。這樣person中的所有物件的name欄位都設定好了。

依據model修改關聯式資料庫是開發中的乙個重要的問題,解決這個問題可以提公升開發速度,不過要在生產環境中隨便使用migrate運算元據庫還是很危險的,有時候需要手動修改資料庫。

手動修改資料庫

當處理模型修改的時候:

如果模型包含乙個未曾在資料庫裡建立的字段,django會報出錯資訊。 當你第一次用django的資料庫api請求表中不存在的字段時會導致錯誤。

django不關心資料庫表中是否存在未在模型中定義的列。

django不關心資料庫中是否存在未被模型表示的table。

新增字段

在你的模型裡新增字段。下例向book模型新增num_pages欄位:12

3456

789class 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

123

4567

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語句來新增新列。

1alter table books_book add column num_pages integer;  

新增 非null 字段

先建立 null 型的字段,然後將該字段的值填充為某個預設值,然後再將該字段改為 not null 型12

345begin;

alter table books_book add column num_pages integer;

update books_book set num_pages=0;

update books_book set num_pages = null;

commit;或者1

alter table add not null default ;

新增foreignkey或manytomanyfield

新增外來鍵即是新增key_id的integer欄位,新增多對多字段是建立乙個新的資料表。

刪除字段

比較簡單,將表中的某列刪掉即可

1alter table books_book drop column num_pages;

使用sqlite3時,會有些麻煩,sqlite3不支援刪除列操作,只有有限地 alter table 支援。你可以使用它來在表的末尾增加一列,可更改表的名稱。 如果需要對錶結構做更複雜的改變,則必須重新建表。重建時可以先將已存在的資料放到乙個臨時表中,刪除原表, 建立新錶,然後將資料從臨時表中複製回來。

如,假設有乙個 t1 表,其中有 「a」, 「b」, 「c」 三列, 如果要刪除列 c :12

3456

78begin 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;

刪除多對多關聯字段

刪掉多對多關聯的資料表即可

1drop table books_book_authors;

刪除模型

刪除資料表即可

1python manage.py dumpdata auth > auth.json

django資料遷移實踐

背景 開始和同事結對開發,一人乙個sqlite3檔案資料庫來儲存配置,有兩個問題 使用django的migrate很麻煩,還得寫db router等控制同步 後來上線發現個問題,那就是檔案資料庫寫的時候會觸發uwsgi的touch reload機制而重啟專案 專案會繼續開發下去資料量會變多,檔案資料...

Django關係型資料庫及遷移

1.在指定資料庫中建立資料庫如mysql中 create database 名字 charset utf8databases default 在models.py中操作 from django.db import models create your models here.class userin...

Django 資料模型欄位及屬性

autofield 乙個能夠根據可用id自增的 integerfield booleanfield 乙個真 假 true false 字段 charfield max length 乙個字串字段,適用於中小長度的字串。對於長段的文字,請使用 textfield commaseparatedinteg...