Peewee 使用(二)——增刪改查更詳細(xì)使用

Peewee系列:
Peewee 使用
Peewee使用之事務(wù)
Peewee批量插入數(shù)據(jù)
Peewee 使用(二)——增刪改查更詳細(xì)使用


在四月份剛接觸Peewee的時(shí)候雷滋,寫過(guò)一篇Peewee 使用奕塑。而后匿情,在使用的過(guò)程中焦匈,發(fā)現(xiàn)很多常用的內(nèi)容需要搜索查閱本冲,今天就在這里整理一下隐解。

一起胰、插入數(shù)據(jù)

插入數(shù)據(jù),我們可以實(shí)例化一個(gè)Model幻工,然后再使用save()的方法插入到數(shù)據(jù)庫(kù)中励两。如下:

# 插入一條數(shù)據(jù)
p = Person(name='liuchungui', birthday=date(1990, 12, 20), is_relative=True)
p.save()

除了上面,我最常用的是insert()方法直接插入數(shù)據(jù)囊颅,它會(huì)返回新插入數(shù)據(jù)的主鍵給我們当悔。

# 插入一條數(shù)據(jù)
p_id = Person.insert({
    'name': 'liuchungui'
}).execute()
 # 打印出新插入數(shù)據(jù)的id
print(p_id)

上面都是插入一條數(shù)據(jù),若是有很多數(shù)據(jù)需要插入踢代,例如幾萬(wàn)條數(shù)據(jù)盲憎,為了性能,這時(shí)就需要使用insert_many()胳挎,如下:

NUM = 10000
data = [{
            'name': '123'
        } for i in range(NUM)]

with database.atomic():
    for i in range(0, NUM, 100):
        # 每次批量插入100條饼疙,分成多次插入
        Person.insert_many(data[i:i + 100]).execute()

至于為啥要使用insert_many(),可以看看我前面寫的Peewee批量插入數(shù)據(jù)慕爬。

二窑眯、查詢數(shù)據(jù)

1、查詢單條數(shù)據(jù)

我們可以直接使用get()獲取單條數(shù)據(jù)医窿,在參數(shù)中傳遞查詢條件伸但。

# 查詢name為liuchungui的Person
p = Person.get(Person.name == 'liuchungui')
print(p.name) # 打印出liuchungui

2、查詢多條數(shù)據(jù)

使用select()查詢留搔,后面不添加where()是查詢整個(gè)表的內(nèi)容。

# 查詢Person整張表的數(shù)據(jù)
persons = Person.select()
# 遍歷數(shù)據(jù)
for p in persons:
    print(p.name, p.birthday, p.is_relative)

我們可以在select()后面添加where()當(dāng)做查詢條件

# 獲取is_relative為True的數(shù)據(jù)
persons = Person.select().where(Person.is_relative == True)
for p in persons:
    print(p.name, p.birthday, p.is_relative)

我們可以通過(guò)sql()方法轉(zhuǎn)換為SQL語(yǔ)句進(jìn)行查看理解

persons = Person.select().where(Person.is_relative == True)
# 打印出的結(jié)果為:('SELECT `t1`.`id`, `t1`.`name`, `t1`.`is_relative` FROM `Person` AS `t1` WHERE (`t1`.`is_relative` = %s)', [True])
print(persons.sql())

3铛铁、查詢數(shù)據(jù)條數(shù)隔显、排序却妨、Limit

查詢數(shù)據(jù)條數(shù),直接在后面加上count()就行了

# 查詢整張表的數(shù)據(jù)條數(shù)
total_num = Person.select().count()

# 查詢name為liuchungui的Person數(shù)量, 返回?cái)?shù)量為1
num = Person.select().where(Person.name == 'liuchungui').count()

排序括眠,使用的是order_by()彪标,參數(shù)內(nèi)加上按對(duì)應(yīng)字段進(jìn)行排序

# 按照創(chuàng)建時(shí)間降序排序
persons = Person.select().order_by(Person.create_time.desc())

# 按照創(chuàng)建時(shí)間升序排序
persons = Person.select().order_by(Person.create_time.asc())

Limit是使用limit(),傳遞一個(gè)數(shù)字掷豺,例如2就是獲取前兩條數(shù)據(jù)捞烟,它可以搭配offset()一起使用

# 相當(dāng)于sql語(yǔ)句: select * from person order by create_time desc limit 5
persons = Person.select().order_by(Person.create_time.asc()).limit(5)

# 相當(dāng)于sql語(yǔ)句中:select * from person order by create_time desc limit 2, 5
persons = Person.select().order_by(Person.create_time.asc()).limit(5).offset(2)

三、更新數(shù)據(jù)

當(dāng)一個(gè)Model實(shí)例擁有主鍵時(shí)当船,此時(shí)使用save()就是修改數(shù)據(jù)

# 已經(jīng)實(shí)例化的數(shù)據(jù),指定了id這個(gè)primary key,則此時(shí)保存就是更新數(shù)據(jù)
p = Person(name='liuchungui', birthday=date(1990, 12, 20), is_relative=False)
p.id = 1
p.save()

也可以使用update()來(lái)更新數(shù)據(jù)题画,一般都會(huì)搭配where()使用

# 更新birthday數(shù)據(jù)
q = Person.update({Person.height: 1.75}).where(Person.name == 'Jack')
q.execute()

當(dāng)然,除了使用Model的屬性德频,我們可以直接使用字典結(jié)構(gòu)來(lái)更新數(shù)據(jù)

q = Person.update({
    'height': 1.75
}).where(Person.name == 'Jack')
q.execute()

四苍息、查詢操作符

在查詢、更新壹置、刪除數(shù)據(jù)的時(shí)候竞思,經(jīng)常會(huì)帶有Where條件語(yǔ)句。而Peewee支持以下類型比較符:


image.png

其中钞护,==盖喷、<、<=难咕、>课梳、>=、!=是很容易理解的步藕,重點(diǎn)提下<<惦界、>>%。用示例說(shuō)明:

# <<使用咙冗,查詢省份屬于湖北和湖南的沾歪,對(duì)應(yīng)sql語(yǔ)句:select * from person where province in ('湖南', '湖北')
persons = Person.select().where(Person.province << ['湖南', '湖北'])

# >>使用,查詢省份為空的雾消,sql語(yǔ)句: select * from person where province is Null
persons = Person.select().where(Person.province >> None)

# %使用灾搏,查詢省份中含有 湖 字,sql語(yǔ)句:select * from person where province like '%湖%'
persons = Person.select().where(Person.province % '%湖%')

有時(shí)立润,我們查詢條件不止一個(gè)狂窑,需要使用邏輯運(yùn)算符連接,而Python中的and桑腮、or在Peewee是不支持的泉哈,此時(shí)我們需要使用Peewee封裝好的運(yùn)算符,如下:

image.png

使用示例如下:

# 查詢湖南和湖北的, 注意需要用()將Person.province == '湖南'包一層
persons = Person.select().where((Person.province == '湖南') | (Person.province == '湖北'))

# 查詢湖南和身高1.75
persons = Person.select().where((Person.province == '湖南') & (Person.height == 1.75))

注意:使用的時(shí)候,需要內(nèi)部還使用()將Person.province == '湖南'包起來(lái)丛晦,否則不會(huì)生效奕纫。示例:persons = Person.select().where((Person.province == '湖南') | (Person.province == '湖北'))

除了上面的操作符以外,Peewee還有更多沒(méi)有重載的操作符烫沙,如下:


image.png

五匹层、聯(lián)表查詢

有時(shí),我們需要查詢兩個(gè)表中的數(shù)據(jù)锌蓄,在Peewee中也可以實(shí)現(xiàn)升筏,官方示例如下:

query = (Tweet
         .select(Tweet.content, Tweet.timestamp, User.username)
         .join(User, on=(User.id == Tweet.user_id))
         .order_by(Tweet.timestamp.desc()))

上面查詢的結(jié)果,會(huì)在Tweet的Model中添加一個(gè)屬性user瘸爽,此時(shí)我們可以通過(guò)user來(lái)訪問(wèn)到查詢到的User表信息您访,如下:

for tweet in query:
    print(tweet.content, tweet.timestamp, tweet.user.username)

六、事務(wù)

Peewee實(shí)現(xiàn)事務(wù)最常用的方法是Database.atomic()方法蝶糯,使用起來(lái)非常簡(jiǎn)單洋只,如下:

from xModels import XUser, database

with database.atomic() as transaction:
    XUser.create(phone='184738373833', password='123456')
    XUser.create(phone='184738373833332323232', password='123456')

更多可參考我前面寫的Peewee使用之事務(wù)

參考

Peewee querying
peewee 查詢

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昼捍,隨后出現(xiàn)的幾起案子识虚,更是在濱河造成了極大的恐慌,老刑警劉巖妒茬,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件担锤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡乍钻,警方通過(guò)查閱死者的電腦和手機(jī)肛循,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)银择,“玉大人多糠,你說(shuō)我怎么就攤上這事『瓶迹” “怎么了夹孔?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)析孽。 經(jīng)常有香客問(wèn)我搭伤,道長(zhǎng),這世上最難降的妖魔是什么袜瞬? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任怜俐,我火速辦了婚禮,結(jié)果婚禮上邓尤,老公的妹妹穿的比我還像新娘拍鲤。我一直安慰自己贴谎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布殿漠。 她就那樣靜靜地躺著赴精,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绞幌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天一忱,我揣著相機(jī)與錄音莲蜘,去河邊找鬼。 笑死帘营,一個(gè)胖子當(dāng)著我的面吹牛票渠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播芬迄,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼问顷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了禀梳?” 一聲冷哼從身側(cè)響起杜窄,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎算途,沒(méi)想到半個(gè)月后塞耕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嘴瓤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年扫外,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廓脆。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筛谚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出停忿,到底是詐尸還是另有隱情驾讲,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布瞎嬉,位于F島的核電站蝎毡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏氧枣。R本人自食惡果不足惜沐兵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望便监。 院中可真熱鬧扎谎,春花似錦碳想、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至预吆,卻和暖如春龙填,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拐叉。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工岩遗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凤瘦。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓宿礁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蔬芥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子梆靖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容