對象關系映射(Object Relational Mapping,簡稱ORM)是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。
Python中的類 ---> 表
Python里面的類屬性 ---> 字段
python 里面的類對象 --->? 數據庫表里的1條數據
我們是面向對象的。當對象的信息發生變化的時候,我們就需要把對象的信息保存在關系數據庫中。程序員會在自己的業務邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關數據,而這些代碼通常都是重復的。
ORM的出現充當了對象和數據庫層次的橋梁作用。
優點:
提高我們的開發效率
開發人員技術參差不齊,大神寫的sql優化非常好
缺點:
查詢效率受影響 關系數據庫技能退化
Django步驟
要想一個頁面展示在用戶面前
1.打開瀏覽器,輸入網址,發起請求
2,接受請求 ,響應內容
-url要配置---> 將來 瀏覽器,輸入的路徑
url(r'^index/')
https://127.0.0.1:8000/index
-視圖要寫---> 用戶輸入 網址之后調用的內容
def index(request):
? ? return render(request,'index.html')
def + 視圖函數的函數名稱 第一個參數 是request
render 返回一個模板 (request,html)
3. 模型 models.py 這個模塊 mvt
django給我們提供了一個orm框架
因為有了這個框架 我們可以不需要去寫各種 sql語句
orm 類---> 表 屬性對應--->字段? 實例對象--->1行數據
屬性類型
當前選擇的數據庫支持字段的類型
渲染管理表單時使用的默認html控件
在管理站點最低限度的驗證 django會為表創建自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列后django不會再創建自動增長的主鍵列。
默認創建的主鍵列屬性為id,可以使用pk代替,pk全拼為primary key。
字段類型
AutoField:自動增長的IntegerField,通常不用指定,不指定時Django會自動創建屬性名為id的自動增長屬性。(必須填入參數primary_key=True)
BooleanField:布爾字段,值為True或False。
NullBooleanField:支持Null、True、False三種值。
CharField(max_length=字符長度):字符串。
映射到數據庫會是varchar
參數max_length表示最大字符個數。
TextField:大文本字段,一般超過4000個字符時使用。
IntegerField:整數。
DecimalField(max_digits=None, decimal_places=None):十進制浮點數。
參數max_digits表示總位數。
參數decimal_places表示小數位數。
FloatField:浮點數。
DateField[auto_now=False, auto_now_add=False]):日期。
參數auto_now表示每次保存對象時,自動設置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為false。
參數auto_now_add表示當對象第一次被創建時自動設置當前時間,用于創建的時間戳,它總是使用當前日期,默認為false。
參數auto_now_add和auto_now是相互排斥的,組合將會發生錯誤。
TimeField:時間,參數同DateField。
DateTimeField:日期時間,參數同DateField。
FileField:上傳文件字段。
ImageField:繼承于FileField,對上傳的內容進行校驗,確保是有效的圖片。
選項 約束
null:如果為True,表示允許為空,默認值是False。
blank:如果為True,則該字段允許為空白,默認值是False。
對比:null是數據庫范疇的概念,blank是表單驗證范疇的。
db_column:字段的名稱,如果未指定,則使用屬性的名稱。
db_index:若值為True, 則在表中會為此字段創建索引,默認值是False。
default:默認值。
primary_key:若為True,則該字段會成為模型的主鍵字段,默認值是False,一般作為AutoField的選項使用。
unique:如果為True, 這個字段在表中必須有唯一值,默認值是False。
4. 不用sqllite 我們使用mysql
如何去配置我們的mysql
4.1 settings.py DATABASE
DATABASES = { 'default': { 'ENGINE':'django.db.backends.mysql',# 數據庫類型
'NAME': 'test1',# 數據庫的名稱,django不會直接給我們創建數據庫需要我們手動創建
'USER': 'root',#數據庫用戶
'PASSWORD': '123456',# 數據庫密碼
'HOST': '127.0.0.1', 'PORT': '3306',# 端口號 } }
4.2 我們需要安裝一個 python連接mysql的驅動 pymysql
4.3 我們需要把這個驅動 添加到項目里面來
項目下的__init__文件里:
import pymysql
pymysql.install_as_MySQLdb()
5. 設計完python的類(表) 不意味著 數據庫里面就有這張表
5.1 生成遷移文件
python manage.py makemigrations
5.2 執行遷移
python manage.py migrate?
同步到數據庫,創表成功,可以插入數據
6. 查詢
6.1 查詢 id=1 的書 =? excat
list = BookInfo.objects.filetr(id=1)
list = BookInfo.objects.filetr(id__exact=1)
mysql日志:
配置:
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
然后執行
sudo service mysql restart
使用如下命令打開mysql日志文件。
sudo tail -f /var/log/mysql/mysql.log
條件查詢
1.判等 ------>? ?exact
2.模糊查詢 ----->? contains
? ? 查詢以指定值開頭 -----> startswith
????查詢以指定值結尾 ------>? endswith??
3.空值查詢 ---->? isnull (是否為null)
4.范圍查詢 ------>? ?in (是否包含在范圍內)
5.比較查詢 ----->? gt、gte、lt、lte:大于、大于等于、小于、小于等于。
6.日期查詢 ---- >year、month、day、week_day、hour、minute、second:對日期時間類型的屬性進行運算。
F對象和Q對象
查詢兩個屬性的比較會使用F對象。
多個過濾器逐個調用表示邏輯與關系,同sql語句中where部分的and關鍵字。
如果需要實現邏輯或or的查詢,需要使用Q()對象結合|運算符,Q對象被義在django.db.models中。
聚合函數
使用aggregate()過濾器調用聚合函數。聚合函數包括:Avg,Count,Max,Min,Sum,被定義在django.db.models中。
aggregate的返回值是一個字典類型
使用count時一般不使用aggregate()過濾器。
注意count函數的返回值是一個數字。
查詢集
返回查詢集的過濾器如下:
all():返回所有數據。
filter():返回滿足條件的數據。
exclude():返回滿足條件之外的數據,相當于sql語句中where部分的not關鍵字。
order_by():對結果進行排序。
返回單個值的過濾器如下:
get():返回單個滿足條件的對象
count():返回當前查詢結果的總條數。
aggregate():聚合,返回一個字典。
判斷某一個查詢集中是否有數據:
exists():判斷查詢集中是否有數據,如果有則返回True,沒有則返回False。
查詢集兩大特性
惰性執行:創建查詢集不會訪問數據庫,直到調用數據時,才會訪問數據庫,調用數據的情況包括迭代、序列化、與if合用。
緩存:使用同一個查詢集,第一次使用時會發生數據庫的查詢,然后把結果緩存下來,再次使用這個查詢集時會使用緩存的數據。
限制查詢集
可以對查詢集進行取下標或切片操作,等同于sql中的limit和offset子句。不支持負數索引。
對查詢集進行切片后返回一個新的查詢集,不會立即執行查詢。