為了不做無病呻吟遥赚,保持信息不被淹沒交汤,所有內(nèi)容都是以問答形式書寫剃幌。
1.什么是ORM?
把數(shù)據(jù)庫操作封裝映射成為對象的操作,保持編程的統(tǒng)一性税肪。在peewee甚至其他的ORM中都是如何映射的:
簡單粗暴说榆,數(shù)據(jù)庫中包含數(shù)據(jù)表虚吟,表結(jié)構(gòu)就是字段寸认,數(shù)據(jù)就是記錄签财。所以定義model class,并包含不同field實例化就是創(chuàng)建表的過程,給model用數(shù)據(jù)實例化就是存儲數(shù)據(jù)偏塞。
2.如何使用peewee?
安裝:pip install peewee
在文件中引用唱蒸,并創(chuàng)建數(shù)據(jù)庫:
? ??from peewee import*
????db=SqliteDatabase('people.db')
根據(jù)業(yè)務(wù)需要創(chuàng)建table并且定義table的相關(guān)操作,這個也是重點
3.創(chuàng)建table
看出兩種方式的異同了嗎灸叼?都會用到Model的繼承神汹,區(qū)別在1是直接繼承Model,就是這個最單純的Model,綁定數(shù)據(jù)庫db也定義在里面,而2是先用basemodel繼承model,并包含了公共信息db,然后我們定義的table再繼承這個不單純的basemodel.
4.來個外鍵
不要理解為數(shù)據(jù)庫中外鍵和主鍵的對應(yīng)關(guān)系古今,就理解成對象與對象之間的一對多的關(guān)聯(lián)
5.一些最基礎(chǔ)的API調(diào)用
db.connect()和db.close(),在一個web請求來的時候鏈接屁魏,操作完成后斷開
db.create_tables([Person,Pet]),根據(jù)上面定義好的表結(jié)構(gòu)來創(chuàng)建table,上面只是定義而已捉腥,這里可以批量創(chuàng)建
grandma=Person.create(name='Grandma',birthday=date(1935,3,1),is_relative=True)
uncle_bob=Person(name='Bob',birthday=date(1960,1,15),is_relative=True)
給表增加數(shù)據(jù)有以上兩種方式氓拼,一個是對table class直接實例化,二是使用class的create方法來實例化抵碟,參數(shù)一樣
uncle_bob.save()將以上的操作給保存到table中桃漾,并返回影響的行數(shù)
herb_mittens.delete_instance()相反,刪除某記錄拟逮,并返回行數(shù)
6.查詢的基本操作
grandma=Person.get(Person.name=='Grandma L.') 單個結(jié)果查詢用get方法
Pet.select().where(Pet.animal_type=='cat')獲得一列結(jié)果selet(),或者加上where限制條件的一列結(jié)果
Pet.select(Pet,Person).join(Person).where(Pet.animal_type=='cat')這是關(guān)聯(lián)列表的正確查詢姿勢撬统。我們知道pet和person是關(guān)聯(lián)在一起的,如果我們要訪問pet.owner.name敦迄,那么這樣做會提高效率恋追,Pet.select(Pet,Person).join(Person)這個過程就是把pet和person根據(jù)關(guān)聯(lián)關(guān)系給一起查了,后面的where是限制條件罚屋。如果不這樣做浙巫,而是直接使用pet.owner.name,那么就相當(dāng)于一個二層循環(huán)了益老,效率低下镊尺。
person.pets.count()
for pet in person.pets
這兩個說明一對多關(guān)系中一是可以有統(tǒng)計信息的,比如count(),也可以循環(huán)尖滚,我們知道"pets"就是我們定義在一(person)中的related_name
7.高級操作
在基于對數(shù)據(jù)庫的理解上區(qū)看文檔