Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析
Migrations
Django中對(duì)Model進(jìn)行修改是件麻煩的事情,syncdb命令僅僅創(chuàng)建數(shù)據(jù)庫(kù)里還沒有的表,它并不對(duì)已存在的數(shù)據(jù)表進(jìn)行同步修改,也不處理數(shù)據(jù)模型的刪除。 如果你新增或修改數(shù)據(jù)模型里的字段,或是刪除了一個(gè)數(shù)據(jù)模型,你需要手動(dòng)在數(shù)據(jù)庫(kù)里進(jìn)行相應(yīng)的修改或者使用South。Django 1.7中已經(jīng)集成了South的代碼,提供了3個(gè)新命令:
- migrate: 用于執(zhí)行遷移動(dòng)作,具有syncdb的功能
- makemigrations: 基于當(dāng)前的model創(chuàng)建新的遷移策略文件
- sqlmigrate: 顯示遷移的SQL語(yǔ)句,具有sqlall的功能
使用起來(lái)很簡(jiǎn)單,對(duì)Model做了修改后,使用makemigrations記錄修改:
$ python manage.py makemigrations Migrations for 'books': 0003_auto.py: - Alter field author on book
你的Model會(huì)被掃描, 然后與migrations文件夾中以前的版本作比較, 然后生成本次遷移文件。
有了新的migration文件,就可以使用migrate修改數(shù)據(jù)庫(kù)模式:
$ 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
也可以針對(duì)單獨(dú)的app生成migration:
$ python manage.py makemigrations your_app_label
也可以對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行修改,首先建立一個(gè)空的migration文件:
python manage.py makemigrations --empty yourappname
文件的內(nèi)容如下:
# -*- coding: utf-8 -*-
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('yourappname', '0001_initial'),
]
operations = [
]
如果想修改某個(gè)Model例如Person的數(shù)據(jù),設(shè)置其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),
]
最后運(yùn)行 python manage.py migrate即可。這樣Person中的所有對(duì)象的name字段都設(shè)置好了。
依據(jù)Model修改關(guān)系數(shù)據(jù)庫(kù)是開發(fā)中的一個(gè)重要的問(wèn)題,解決這個(gè)問(wèn)題可以提升開發(fā)速度,不過(guò)要在生產(chǎn)環(huán)境中隨便使用migrate操作數(shù)據(jù)庫(kù)還是很危險(xiǎn)的,有時(shí)候需要手動(dòng)修改數(shù)據(jù)庫(kù)。
手動(dòng)修改數(shù)據(jù)庫(kù)
當(dāng)處理模型修改的時(shí)候:
- 如果模型包含一個(gè)未曾在數(shù)據(jù)庫(kù)里建立的字段,Django會(huì)報(bào)出錯(cuò)信息。 當(dāng)你第一次用Django的數(shù)據(jù)庫(kù)API請(qǐng)求表中不存在的字段時(shí)會(huì)導(dǎo)致錯(cuò)誤。
- Django不關(guān)心數(shù)據(jù)庫(kù)表中是否存在未在模型中定義的列。
- Django不關(guān)心數(shù)據(jù)庫(kù)中是否存在未被模型表示的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
運(yùn)行manage.py sqlall yourappname來(lái)測(cè)試模型新的CREATE TABLE語(yǔ)句。
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
);
開啟你的數(shù)據(jù)庫(kù)的交互命令界面(比如,psql或者mysql,或者可以使用manage.py dbshell。 執(zhí)行ALTER TABLE語(yǔ)句來(lái)添加新列。
ALTER TABLE books_book ADD COLUMN num_pages integer;
添加 非NULL 字段
先創(chuàng)建 NULL 型的字段,然后將該字段的值填充為某個(gè)默認(rèn)值,然后再將該字段改為 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字段,添加多對(duì)多字段是創(chuàng)建一個(gè)新的數(shù)據(jù)表。
刪除字段
比較簡(jiǎn)單,將表中的某列刪掉即可
ALTER TABLE books_book DROP COLUMN num_pages;
使用sqlite3時(shí),會(huì)有些麻煩,sqlite3不支持刪除列操作,只有有限地 ALTER TABLE 支持。你可以使用它來(lái)在表的末尾增加一列,可更改表的名稱。 如果需要對(duì)表結(jié)構(gòu)做更復(fù)雜的改變,則必須重新建表。重建時(shí)可以先將已存在的數(shù)據(jù)放到一個(gè)臨時(shí)表中,刪除原表, 創(chuàng)建新表,然后將數(shù)據(jù)從臨時(shí)表中復(fù)制回來(lái)。
如,假設(shè)有一個(gè) t1 表,其中有 "a", "b", "c" 三列, 如果要?jiǎng)h除列 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;
刪除多對(duì)多關(guān)聯(lián)字段
刪掉多對(duì)多關(guān)聯(lián)的數(shù)據(jù)表即可
DROP TABLE books_book_authors;
刪除模型
刪除數(shù)據(jù)表即可
DROP TABLE books_book;
數(shù)據(jù)遷移
django 項(xiàng)目提供了一個(gè)導(dǎo)出的方法 python manage.py dumpdata, 不指定 appname 時(shí)默認(rèn)為導(dǎo)出所有的app
python manage.py dumpdata myapp > myapp.json
導(dǎo)出的文件內(nèi)容格式:
[
{
"model": "myapp.person",
"pk": 1,
"fields": {
"first_name": "John",
"last_name": "Lennon"
}
},
{
"model": "myapp.person",
"pk": 2,
"fields": {
"first_name": "Paul",
"last_name": "McCartney"
}
}
]
數(shù)據(jù)導(dǎo)入:
python manage.py loaddata myapp.json
導(dǎo)出用戶數(shù)據(jù):
python manage.py dumpdata auth > auth.json
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
通過(guò)實(shí)例解析Python RPC實(shí)現(xiàn)原理及方法
這篇文章主要介紹了通過(guò)實(shí)例解析Python RPC實(shí)現(xiàn)原理及方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
利用Python產(chǎn)生加密表和解密表的實(shí)現(xiàn)方法
這篇文章主要介紹了利用Python產(chǎn)生加密表和解密表的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法實(shí)例分析
這篇文章主要介紹了python 正則表達(dá)式貪婪模式與非貪婪模式原理、用法,結(jié)合實(shí)例形式詳細(xì)分析了python 正則表達(dá)式貪婪模式與非貪婪模式的功能、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-10-10
python使用psutil模塊獲取系統(tǒng)狀態(tài)
作為程序猿,大家可能都熟悉linux系統(tǒng)的基礎(chǔ)信息獲取方法都是通過(guò)shell來(lái)獲取,但是在python中,我們還可以使用psutil模塊來(lái)獲取系統(tǒng)信息。psutil模塊把shell查看系統(tǒng)基礎(chǔ)信息的功能都包裝了下,使用更加簡(jiǎn)單,功能豐富。2016-08-08
Django分頁(yè)功能的實(shí)現(xiàn)代碼詳解
在本篇文章里小編給大家整理了關(guān)于Django分頁(yè)功能的實(shí)現(xiàn)代碼以及相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們可以跟著學(xué)習(xí)參考下。2019-07-07
linux centos 7.x 安裝 python3.x 替換 python2.x的過(guò)程解析
這篇文章主要介紹了linux centos 7.x 安裝 python3.x 替換 python2.x的過(guò)程解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
python調(diào)用自定義函數(shù)的實(shí)例操作
在本文里我們給大家整理了關(guān)于python調(diào)用自定義函數(shù)的實(shí)例操作相關(guān)內(nèi)容,有此需要的朋友們可以學(xué)習(xí)參考下。2019-06-06

