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時如果查詢的值不存在會報錯,而且沒有第一種方法簡潔