django支持各類主流的數據庫,項目根目錄中的db.sqlite就是數據庫文件,默認狀況下django配置的就是這個文件,它是個文件類型的數據庫,比較小
一.數據庫的鏈接配置
django 鏈接mysql的配置流程:
(1) 安裝 pymysql: pip install pymysql
(2)建立數據庫用戶 這裏須要有建立數據庫權限的用戶!
1)可使用navicat管理mysql數據庫
2)通常項目會有數據庫人員負責,這裏練習咱們使用root帳戶進入mysql而後建立一個有建立數據庫權限的用戶:
(1)輸入命令,首先遠程鏈接SSH,mysql -uroot -pqwe123;進入mysql
(2)建立新用戶:mysql> create user zx_root IDENTIFIED by 'xxxxx'; //identified by 會將純文本密碼加密做爲散列值存儲
zx_root是用戶名,'xxxxx'是密碼,用戶名和密碼能夠替換爲咱們本身的內容,密碼要用引號括起來,
****注意mysql語句後面要有;才能結束
(3)給權限:mysql> grant all on *.* to zx_root;
(4)查看用戶權限:mysql> show grants for zx_root;
(5)使受權當即生效:FLUSH PRIVILEGES;
(3)建立數據庫crm
create database crm;
(4) 修改配置
項目文件夾裏的settings下的DATABASES,default裏的'ENGINE'(引擎)的值,把backends(後端).後面的sqlite3改爲mysql
把 'NAME'的值改成'crm'
增長鍵值對'USER':'root', ----若是上面建立好了有建立數據庫權限的用戶,則輸入該用戶的名字
增長鍵值對'PASSWORD':'qwe123', --------若是使用建立的用戶,填入該用戶的密碼
增長鍵值對'HOST':'127.0.0.1',
增長鍵值對'PORT':'3306', #這裏用字符串或者數字均可以,最好字符串
(5)修改項目文件夾(settings.py文件所在的目錄)下__init__.py 文件寫上:
import pymysql #若是環境中新裝的pymysql導入不了。close project一下從新進入
pymysql.install_as_MySQLdb() #歷史緣由,由於python2的時候用的MySQLdb,因此要加這個
(6)設置時區 仍是在settings.py裏 TIME_ZONE = 'Asia/ShangHai' # 北京時間
二.django的ORM系統
-對象關係映射(Object Relational Mapping,簡稱ORM)!
底層仍是執行的SQL,必須經過SQL才能操做數據庫,只是寫代碼這一層看不到
簡單的說就是用面向對象的方式,描述數據庫,操做數據庫,
達到不用編寫SQL語句就能對數據庫進行增刪改查。
映射關係:
模型類對應數據表,類屬性對應表字段名,類的實例對應表中的一條數據
模型類必須寫在app下的models.py文件中,模型若是須要映射到數據庫,所在的app必須被安裝
三.模型的建立與激活
1.建立模型:(1)teacher這個app文件夾中的models.py中,建立類 class Student(models.Model) --必須繼承models.Model
Student的模型,表明學生
(2)建立字段名(類變量,類屬性):1)name = models.CharField(max_length=)
---CharField自己也是一個類,他有一個必備參數max_length,至關於sql中varchar的長度
2)age = models.SmallIntegerField(default=0)
---默認值default也能夠不給,
3)qq = models.CharField(max_length=20,default='')
---CharField 最好不要讓他None,能夠給個空字符串作默認值
---通常數據庫中qq,電話號碼這些用字符串而不是int類型,操做方便
4)c_time = models.DateTimeField(verbose_name='建立時間')
---建立時間字段,verbose_name參數是提示信息,是給人看的,人類可讀的名稱
能夠是位置參數,放第一個,也能夠是關鍵字參數
還能夠加一個參數auto_now_add=True,這樣就不須要手動輸入時間了,django自動幫咱們處理,
保存當前對象的時候就會自動填入當前時間
5)id 通常省略就好了,不用咱們手動添加,
若是模型類中咱們沒有定義主鍵,模型類會自動幫咱們加了一個以下的id類屬性
id = models.IntegerField(primary_key=True,auto_created=True)
建立的全部模型類實例都自動給個這個屬性
總結:
1. 每個模型都是django.db.models.Model的子類
2. 類變量 表示模型中的數據庫字段
3. 每個字段由一個字段類的實例表示
注意:
(1)每一個變量名也就是數據庫中表的列名,要機器友好,即用ASSIIC碼中的字符,不要用中文,不要用數字,不要_開頭,數字開頭
(2)字段名中verbose_name參數通常都在第一個位置參數,指定人類可讀的名稱,若是定義時沒有加這個參數,則直接使用字段名
(3)CharField字段必須提供max_length參數,他是必須參數,不光對數據模型起做用,也對數據庫起做用,還對校驗起做用(Form表單中會看到)
(4)字段還有不少可選參數,好比default,它對應數據庫中的默認值
2.激活模型:有了以上建立的模型,django會爲這個應用程序建立一個數據庫模式,
也就是先會建立表,生成SQL語句,根據上面的模型類建立去訪問Student對象的python數據庫的API,
爲了實現這些,咱們要在項目文件夾中的settings.py中註冊
1.在項目中註冊app:INSTALLED_APPS中加入app名
2.運行數據庫遷移命令(必定要在項目根目錄下)
python manage.py makemigrations teacher
-若是不加app名teacher,則會對(settings.py的INSTALLED裏安裝過的)全部app進行遷移
告訴django,咱們作了哪些數據庫的更改
遷移,是django對模型的更改方式,會生成遷移文件,相似於app下的migrations文件夾下的0001_initial.py這樣,咱們甚至能夠手動更改遷移文件的內容
遷移以後,mysql中能夠能夠進入建立的數據庫,這時修改只是被記錄下來,數據庫中尚未表
sqlmigrate 從遷移獲取sql語句:python manage.py sqlmigrate teacher 0001 ---這裏不用寫全0001_initial.py,teacher這是應用名稱,必須寫上
遷移會生成的SQL語句以下:
--
-- Create model Student
--
CREATE TABLE `teacher_student` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, ---若是咱們沒有建立主鍵,這裏會自動建立名爲id的主鍵,至關於模型類自動默認給咱們添加了這個類屬性,
`name` varchar(20) NOT NULL,
`age` smallint NOT NULL,
`sex` smallint NOT NULL,
`qq` varchar(20) NOT NULL,
`phone` varchar(20) NOT NULL,
`c_time` datetime(6) NOT NULL);
COMMIT;
3.運行migrate命令,使遷移生效
python manage.py migrate teacher ---若是寫上app名,則只會遷移這個app中的模型,不寫則註冊過的都遷移
這以後咱們建立的數據庫中才會生成表,
# 表名 appname_模型name.lower
django_migrations是默認生成的記錄migration的表
四.數據的增刪改查
(1)工具 djang shell 調試工具(scrapy的shell借鑑了django的)
用shell以前最好先在環境中裝ipython ,而後直接運行命令進入shell,只要裝了ipython,默認就能進入ipython的shell
python manage.py shell
(2)進入shell命令行後,首先導入models:from teacher.models import Student ---輸一半按tag能夠補全
想查看student中有沒有數據,能夠: Student.objects ----objects是模型的一個方法,它實際上是一個管理器,
它自己也是一個對象,建立了模型它就連上了,每個模型都有一個objects,經過objects就能夠操做、管理模型
(3)想查詢模型中全部的值,能夠Student.objects.all()
---它返回的是一個查詢集對象,返回的值不算友好,默認返回<QuerySey:[<Student:Student Object(1)>,<Student:Student Object(2)>,....]>
若是咱們想讓他運行時直接顯示實例對象的各個實例屬性打印出來,則模型類中能夠重寫方法__str__:
def __str__(self):
return '%s-%s'%(self.name,self.age)
這個方法對數據庫不形成任何影響,不用作數據庫遷移,可是重寫後須要從新進入shell,並從新導入庫才能起做用,
模型自動建立了id這個屬性,這裏重寫的__str__方法返回值多個self.id也是能夠的
return '%d-%s-%s' % (self.id, self.name, self.age),建立的實例對象都帶個id的實例屬性
若是建立了實例對象,這時候Student.objects.all() 的結果是<QuerySey:[<Student:1-貝吉塔-3>,<Student:2-特蘭克斯-17>,....]>
(4)想查詢模型中某個值,能夠定義s = Student.objects.get(id=1),而後s,得到符合條件的某實例,s.name,s.age這樣還能查到該實例的對應屬性值
(5) 增:
4種方法:在shell環境中,無論什麼方法首先都要保證導入了models:from teacher.models import Student
1)表中一條數據,對應模型類中的一個實例,即一個對象,建立一條,能夠實例化一下,表的字段在實例化的過程當中經過傳遞參數加進去
(1)實例化:s1 = Student(name='貝吉塔',age='3',qq='123456')
(2)保存: s1.save() 爲了不輸錯,實例化後數據庫中尚未數據,想把實例化的對象保存到數據庫,須要運行save方法
注意存在數據庫中的時間字段必定是UTC時間,爲了避免同時區不一樣格式的統一,
而取出來的時間則轉換成settings裏設置的時區,取出來的時間指的是是渲染在模板中顯示的時間
模型類實例中怎麼查詢,打印,出來的還都是utc時間
2)建立空實例,而後賦值
(1)先建立一個空實例s2 = Student()
(2)依次賦值實例屬性s2.name = '特蘭克斯'
s2.age = 17
.....
(3)保存:s2.save()
3)直接create:Student.objects.create(實例屬性1,實例屬性2.。。)
這種方法直接操做數據庫,給表添加記錄
運行這個命令後,建立記錄同時,直接能夠返回剛建立的對象
4)get_or_create:相似於上面的create
s=Student.objects.get_or_create(實例屬性1,實例屬性2.。。)
這種方式先查,查完再建立,返回一個元組,元組第一個元素是該對象,第二個元素是是否建立成功:
若是模型中已經有該對象,則元組第一個元素則是該對象,第二個元素是false,即沒有建立該對象,是查來的
若是模型中尚未該對象,則元組第一個元素是該對象,第二個元素是True,即建立了該對象,
***親測是否同一對象取決於建立時給的參數是否徹底一致,前面同樣多給個元素,也會建立,而不是返回查詢結果和False的元組
別的參數相同,改其中一個參數,也會建立
5)增長模型類實例數據,也能夠在app的視圖函數中,導入模型類,而後定義函數,增長類的實例,上述四種方法,能夠在視圖函數模塊中,先導入模型類
from .models import Student
def add_student(request):
方法一:實例化,而後save。。。。
方法二:實例化一個空的對象,而後定義實例屬性,而後save。。。
方法三:直接create
方法四:get_or_create
return render(request,模板文件)
(6)查:
1)Student.objects.all() --查全部,他返回QuerySet對象
(1)咱們寫res=Student.objects.all()的時候,這樣寫尚未操做數據庫,
它是一個惰性的,只有咱們要把這個值計算出來的時候它才操做數據庫
(2)查詢集能夠看到sql語句print(res.query),結果其實就是至關於select * from teacher_student的sql語句
(3)shell中輸入res的時候返回的查詢集,他能夠循環能夠迭代,還能夠切片
切片print(res[1:2].query)
切片返回的結果比上面不切片的後面多了兩個東西LIMIT 1 OFFSET 1
LIMIT --獲取數量,OFFSET偏移量
2)Student.objects.get(條件) --查詢一條,他返回的不是查詢集,而是一個對象,
執行時馬上操做數據庫,沒有query,拿不到它的sql語句,只能在mysql日誌上看到他的sql語句
至關於數據庫中的select * from 表名 where 條件。。。。
***get方法返回一條數據,若是匹配到符合條件的有不少條,則會報錯
因此get方法通常只和主鍵對應,可是表裏的主鍵不見得都叫id
這裏有個快捷方式pk,它表明了表的主鍵,無論表的主鍵叫什麼,用pk查均可以
3)filter:res=Student.objects.filter(參數=值) --返回查詢集
print(res.query) -至關於sql中用where的結果
(7)修改:
1)賦值:s=Student.objects.get(name='xxx')
s.age=16
s.save()
查完修改,用於改一條數據,別忘了save()保存的時候才能把修改保存到數據庫
2)update:Student.objects.filter(name='xxx').update(age=16)
把匹配出來的全部符合條件的數據的年齡都改爲16,返回修改的記錄條數
(8)刪除:delete()方法
1)刪一條:s=Student.objects.get(pk=2)
s.delete() ----返回一個元組,第一個元素是刪除的數據條數,第二個元素是{'表的名稱':刪除的數據條數}
2)批量刪:Student.objects.filter(sex=1).delete()
返回元素,(刪除的數據條數,{'表名':刪除的數據條數})
(9)計數:Student.objects.count() ----返回模型類實例數
五。應用到視圖:
1.首先視圖函數的模塊中導入模型類:from .models import Student
2.視圖函數中student=Student.objects.all()
3.根據數據庫中表的字段修改對應模板的模板變量
python