最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析

 更新時(shí)間:2019年08月01日 10:20:40   作者:再見紫羅蘭  
這篇文章主要介紹了Django模型修改及數(shù)據(jù)遷移實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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語句,具有sqlall的功能

使用起來很簡(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è)重要的問題,解決這個(gè)問題可以提升開發(fā)速度,不過要在生產(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來測(cè)試模型新的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
);

開啟你的數(shù)據(jù)庫(kù)的交互命令界面(比如,psql或者mysql,或者可以使用manage.py dbshell。 執(zhí)行ALTER TABLE語句來添加新列。

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 支持。你可以使用它來在表的末尾增加一列,可更改表的名稱。 如果需要對(duì)表結(jié)構(gòu)做更復(fù)雜的改變,則必須重新建表。重建時(shí)可以先將已存在的數(shù)據(jù)放到一個(gè)臨時(shí)表中,刪除原表, 創(chuàng)建新表,然后將數(shù)據(jù)從臨時(shí)表中復(fù)制回來。

如,假設(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)文章

  • Sanic框架應(yīng)用部署方法詳解

    Sanic框架應(yīng)用部署方法詳解

    這篇文章主要介紹了Sanic框架應(yīng)用部署方法,結(jié)合實(shí)例形式分析了Sanic框架應(yīng)用部署的具體流程、相關(guān)命令與使用技巧,并附帶說明了Gunicorn的配置方法,需要的朋友可以參考下
    2018-07-07
  • python except異常處理之后不退出,解決異常繼續(xù)執(zhí)行的實(shí)現(xiàn)

    python except異常處理之后不退出,解決異常繼續(xù)執(zhí)行的實(shí)現(xiàn)

    這篇文章主要介紹了python except異常處理之后不退出,解決異常繼續(xù)執(zhí)行的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 淺析python打包工具distutils、setuptools

    淺析python打包工具distutils、setuptools

    python包在開發(fā)中十分常見,一般的使用套路是所有的功能做一個(gè)python模塊包,打包模塊,然后發(fā)布,安裝使用。這篇文章給大家介紹了python打包工具distutils、setuptools的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2018-04-04
  • python json.loads兼容單引號(hào)數(shù)據(jù)的方法

    python json.loads兼容單引號(hào)數(shù)據(jù)的方法

    今天小編就為大家分享一篇python json.loads兼容單引號(hào)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python?列表(list)的常用方法

    Python?列表(list)的常用方法

    這篇文章主要介紹了Python?列表(list)的常用方法,這節(jié)主要講列表,列表用于存儲(chǔ)任意數(shù)目、任意類型的數(shù)據(jù)集合,本文通過示例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2023-05-05
  • Python讀取yaml文件的詳細(xì)教程

    Python讀取yaml文件的詳細(xì)教程

    這篇文章主要給大家介紹了關(guān)于Python讀取yaml文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python 添加命令行參數(shù)步驟

    Python 添加命令行參數(shù)步驟

    這篇文章主要介紹了Python 添加命令行參數(shù)步驟,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 基于python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的瀏覽器引擎

    基于python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的瀏覽器引擎

    瀏覽器引擎是用來處理、渲染和顯示網(wǎng)頁(yè)內(nèi)容的核心組件,其主要任務(wù)是將用戶輸入的URL所代表的網(wǎng)頁(yè)資源加載并呈現(xiàn)出來,通常包括HTML、CSS、JavaScript以及各種多媒體內(nèi)容,本文給大家介紹了如何基于python實(shí)現(xiàn)一個(gè)簡(jiǎn)單的瀏覽器引擎,需要的朋友可以參考下
    2024-10-10
  • python、PyTorch圖像讀取與numpy轉(zhuǎn)換實(shí)例

    python、PyTorch圖像讀取與numpy轉(zhuǎn)換實(shí)例

    今天小編就為大家分享一篇python、PyTorch圖像讀取與numpy轉(zhuǎn)換實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python實(shí)現(xiàn)的Google IP 可用性檢測(cè)腳本

    Python實(shí)現(xiàn)的Google IP 可用性檢測(cè)腳本

    這篇文章主要介紹了Python實(shí)現(xiàn)的Google IP 可用性檢測(cè)腳本,本文腳本需要Python 3.4+環(huán)境,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

马龙县| 岗巴县| 西城区| 河东区| 军事| 阿拉善右旗| 扶余县| 黔江区| 莒南县| 镇雄县| 湟源县| 丹阳市| 洞头县| 珲春市| 徐闻县| 汨罗市| 新余市| 蓝山县| 友谊县| 黄骅市| 孟津县| 云龙县| 岳西县| 华阴市| 镇原县| 钟祥市| 伊通| 武宁县| 会宁县| 南溪县| 阜阳市| 历史| 资溪县| 绥江县| 柯坪县| 许昌县| 平潭县| 滁州市| 镶黄旗| 望江县| 高陵县|