Django框架中的mysql資料庫
阿新 • • 發佈:2018-11-06
1、連結資料庫
mysql,sqlserver,oracle...
django預設只能連結關係型資料庫
1、安裝依賴的庫
可以使用的庫:1、pymysql
2、python_mysql(不穩定)
3、mysqlclient(配置麻煩)
安裝pymysql:pip install pymysql
如果出現timeout超時可以使用其他的資源下載:pip install 模組名 -i http://pypi.douban.com/simple
2、匯入庫
在__init__檔案中編寫: # 匯入pymysql模組 import pymysql pymysql.install_as_MySQLdb()
3、在setting的database中配置mysql的連線
'ENGINE':'django.db.backends.mysql', 設定驅動
'NAME':'week01', 設定資料庫名
'USER':'root', 設定使用者名稱
'PASSWORD':'dxx1123', 設定密碼
'HOST':'localhost', 設定主機地址
'PORT':3306, 設定埠號
4、注意:不要忘記了在資料庫中建立該庫
create database 資料庫名 charset='utf8'
5、連線mysql資料庫
點選左側database--- + ---data source ---資料庫型別(如:mysql)--- 設定 賬戶 密碼 主機(注意:如果對mysql設定遠端連線,需要使用遠端連線的賬號密碼)
6、測試程式是否能連線
1、執行遷移
python manage.py makemigrations
python manage.py migrate
2、看到自動生成的表即可
2、orm 物件關係隱射–思想:相當於一個翻譯機
object relational mapping
1、開發人員不需要寫複雜的sql語句,直接呼叫對應的方法即可
2、開發人員不需要封裝查詢結果,查詢結果直接就是物件,可以直接使用
3、如果開發人員需要更換資料庫,不需要更改任何程式碼,直接修改資料庫的連線即可
3、建立一個表
1、需要在model模組中建立一個類
注意該類必需繼承models.Model
注意:表名預設是 應用名_類名
2、定義屬性名—屬性需要與表中欄位對應
欄位名即屬性名
欄位的資料型別
欄位的約束型別
3、案例:
# 定義模型
# 注意:執行遷移後,才會在資料庫自動建立對應的表
# 預設的表名為:應用名_類名 類名會自動轉換成全小寫
# 預設會自動建立主鍵id,如果使用AutoField則不會自動建立
class Person(models.Model):
p_name = models.CharField(max_length = 20,null=False,unique=True)
p_age = models.IntegerField(default = 10)
p_sex = models.BooleanField(default = True)
表的結構是可以修改的,修改後,需要重新遷移才能生效,最好不要修改
修改表名:
可以使用(內部類):
class Meta:
db_table = '表名'
修改屬性名:
預設的欄位名就是定義的屬性名
可以使用 db_column = '欄位名'
4、增加一個數據
1、建立一個物件
2、設定屬性
3、儲存資料 物件名.save()
5、刪除資料
mysql語句:delete from 表名 where 條件
1、要刪除資料,前提條件是先查詢到對應的資料
2、刪除:
可以直接刪除多個結果,也可以直接刪除一個
查詢結果.delete()
6、修改資料
mysql語句:update 表名 set 欄位名=資料.. where 條件
1、要修改資料,前提條件也是先查詢到對應的資料
2、修改:
物件名.屬性名 = 值
物件名.save()
7、查詢資料
1、查詢方法
格式:類名.objects.方法 ---支援鏈式呼叫
1、有多條結果的
all() 獲取所有的結果
filter(條件) 按照條件篩選資料
exclude(條件) 篩選出滿足條件以外的資料
2、單個結果的
first() 獲取結果集的第一個
last() 獲取結果集的最後一個
get() 獲取一個結果
注意:有且只有一個結果的時候使用get()才可以,如果結果超過一個或沒有,程式都會出錯
3、其他
count() 獲取結果集的數量
order_by("-屬性名") 表示按照屬性名對應的值排序,預設是升序,-屬性名錶示降序排序
如果是字元型別的資料,是按照字元對應的ACSII碼來排序的,一個字元一個字元的比較,如:'aac' 'abc' ,'aac'小
exists() 判斷查詢結果集中是否有資料
values() 獲取結果集的資料,該資料是類似字典的形式,方便操作
2、條件中的運算子
格式:屬性名__運算子 = 值 (兩個下劃線)
運算子:
gt 大於
gte 大於等於
lt 小於
lte 小於等於
= 等於 exact
不等於 exclude(條件)
isNull 是空的資料
startwith 查詢以某個字元開始
endwith 查詢以某個字元結果
contain 查詢包含某個字元
i 是ignore的簡寫,忽略大小寫
istartwith 查詢以某個字元開始
iendwith 查詢以某個字元結果
icontain 查詢包含某個字元
in 成員運算子,是否是集合中值的其中一個,滿足一個就符號條件
特殊用法** pk = 值 pk是主鍵的簡寫
3、Q與F物件
1、Q物件,用來幫助實現 邏輯運算子
需要倒包
& 且 如:...filter(Q(p_age__gt=90)&Q(p_age__lt=95))
| 或 如:...filter(Q(p_name='小明')|Q(p_name='小強'))
~ 非 如:...filter(~Q(p_age__lte=100))
2、F物件,用來幫助自己屬性與自己的屬性比較
如:需求:實現年齡比id小的資料
persons=Person.objects.filter(p_age__lt=F('id'))
4、查詢結果的切片
格式:結果集[start:stop] 左閉右開
擷取從start位置到stop位置的資料
5、聚合函式的使用
注意:1、大小寫 2、倒包
Max 最大值
Min 最小值
Avg 平均值
Sum 總和
如:求年齡最大的/最小的
res=Person.objects.all().aggregate(Max('p_age'))
res=Person.objects.all().aggregate(Min('p_age'))