1. 程式人生 > >python自動化運維學習第二十天--ORM增刪改查

python自動化運維學習第二十天--ORM增刪改查

資料庫的配置

django支援的資料庫型別有sqlite、MySQL、oracle、postgresql。
Django預設使用的是sqlite資料庫,自帶了sqlite資料庫驅動,引擎名為django.db.backends.sqlite3。在settings.py中可以檢視

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

使用MySQL時需要修改這個配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
       'NAME': 'books',       #資料庫名稱
        'USER': 'root',       #資料庫使用者名稱
        'PASSWORD': '',       #資料庫密碼
        'HOST': '',           #資料庫主機,留空預設為localhost
        'PORT': '3306',       #資料庫埠
    }
}

啟動專案,會報錯:no module named MySQLdb
這是因為django預設匯入的驅動是MySQLdb,可是MySQLdb對於py3有很大問題,所以我們需要的驅動是PyMySQL,只需要找到專案名檔案下的__init__,在裡面寫入:

import pymysql
pymysql.install_as_MySQLdb()

ORM

前面講過ORM是對資料庫操作的封裝,對ORM操作即可實現對資料庫的增刪改查等操作。
先在modules.py中建立幾個表

from django.db import models

class UserInfo(models.Model):
    #num = models.IntegerField(default=0)      #建立數字型別的欄位名,預設是0
    name = models.CharField(max_length=32, verbose_name="姓名"
) #建立一個字元型別的欄位,最大長度為32 username = models.CharField(max_length=32,null=True) password = models.CharField(max_length=32,null=True) def __str__(self): return self.username #return self.num+self.name+self.username class Number(models.Model): num = models.OneToOneField(to="UserInfo", verbose_name="學號") #該表與UserInfo表一對一關係 def __str__(self): return self.num class School(models.Model): name = models.CharField(max_length=128, null=True, blank=True, verbose_name="名字") mac = models.URLField(max_length=128, null=True, blank=True, verbose_name="地址") #URLField也是字元型別,只是python封裝了判斷URL的演算法 email = models.EmailField(max_length=128, null=True, blank=True, verbose_name="郵箱") #EmailField也是字元型別,只是python封裝了判斷email的演算法 #true_false = models.BooleanField(max_length=128, null=True, blank=True, verbose_name="是否") #布林型別的 #date = models.DateField(verbose_name="日期") #日期型別 #cla = models.ForeignKey(to="Classes") #該表對classes表的關係是一對多 def __str__(self): return self.name class Classes(models.Model): sch = models.ForeignKey(to="School", default=1) name = models.CharField(max_length=128, null=True, blank=True, verbose_name="班級名") user = models.ManyToManyField(to="UserInfo") #該表與UserInfo表是多對多關係 def __str__(self): return self.name

在多對多關係中,Django會額外建立一個classes和userinfo對應關係的表classes_user表

查詢

以上已經建立了幾個表,再往每個表中新增一些資料,下面開始從資料庫中查詢資料
在urls.py檔案中配置路由到views的test方法
url(r'^test/', views.test),
views.py檔案

def test(request):
    school_li = models.School.objects.all()    #獲取到School表中所有資料,放到school_li變數中
    for item in school_li:
        print(item.name, item.email)
    school = models.School.objects.get(id=1)    #使用get時,如果檢索值不存在,則會報錯
    print(school.name)
    obj = models.School.objects.filter(name='new_east')     #使用filter時,如果檢索的值不存在,則返回空(沒有值),推薦使用filter方法
    for item in obj:
        print(item)

    dic = {'name':'new_east'}
        obj1 = models.School.objects.filter(**dic).first()
    print(obj1)
    obj2 = models.School.objects.get(**dic)
    print(obj2)
    return HttpResponse("查詢資料")

程式碼中列舉了幾種查詢的方法,根據需要來選擇。

增加

在views.py的test方法中對資料庫表增加資料。

def test(request):
    dic1= {'name': '藍翔'}
    obj3 = models.School.objects.create(**dic1)
    print(obj3)
    obj4 = models.School.objects.create(name='黃埔', mac='http://www.huangpu.com', email='[email protected]gpu.com')
    print(obj4)
    return HttpResponse("插入資料")

啟動後,訪問test頁面就會在school表中插入資料。

刪除

從資料庫表中刪除資料,其實也比較簡單,還是寫在view裡的test方法中

    obj5 = models.School.objects.filter(id=3).delete()
    #obj5 = models.School.objects.filter(**dic).delete()
    print(obj5)

執行後,obj5是一個元組,會有兩個元素,第一個是刪除的條數,第二個元素是一個字典,字典裡的是刪除表名和對應的條數
(1, {'demo.School': 1}) obj5的輸出結果

修改

修改也比較簡單,看程式碼

    obj6 = models.School.objects.filter(name='黃埔').update(name='北大', mac='https://www.pku.edu.cn', email='[email protected]')
    print(obj6)

執行後返回的是一個int型別,表示修改的行數
修改還有另一種方法

    obj7 = models.School.objects.get(name='黃埔')
    obj7.name='北大'
    obj7.save()

這種方法不推薦使用,因為在get時如果查詢的值不存在會報錯,而且沒有第一種方法簡潔