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支持以下類型比較符:
其中钞护,==盖喷、<、<=难咕、>课梳、>=、!=是很容易理解的步藕,重點(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)算符,如下:
使用示例如下:
# 查詢湖南和湖北的, 注意需要用()將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)有重載的操作符烫沙,如下:
五匹层、聯(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ù)