1. 程式人生 > >Django框架中的mysql資料庫

Django框架中的mysql資料庫

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'))