摘要:顧名思義,就是將關(guān)系型數(shù)據(jù)庫(kù)與中的對(duì)象關(guān)聯(lián)起來(lái),提供了一種操作數(shù)據(jù)的簡(jiǎn)便方式,相當(dāng)于對(duì)數(shù)據(jù)庫(kù)加了一層更友好的接口。新增數(shù)據(jù)對(duì)象方法方法直接創(chuàng)建數(shù)據(jù)對(duì)象,需要調(diào)用方法保存到數(shù)據(jù)庫(kù)中。
咱們編程教室有不少同學(xué),學(xué)完了基礎(chǔ)課程,掌握了一定的編程能力,開(kāi)始做項(xiàng)目了。然后很可能遇到一個(gè)問(wèn)題:管理數(shù)據(jù)。課程里有講過(guò)用文件保存數(shù)據(jù),還有 pickle 、 csv 等模塊輔助。但對(duì)于稍微復(fù)雜一點(diǎn)的數(shù)據(jù),往往不夠方便。成熟的解決方案就是使用 數(shù)據(jù)庫(kù) 。
估計(jì)每個(gè)剛剛使用數(shù)據(jù)庫(kù)的人都會(huì)被坑得遍體鱗傷。對(duì)于一個(gè)剛剛學(xué)會(huì) Python 不久的開(kāi)發(fā)新手來(lái)說(shuō),使用數(shù)據(jù)庫(kù)的 SQL 語(yǔ)句 幾乎相當(dāng)于再學(xué)一種新的語(yǔ)言。雖然 sqlite 、 pymysql 等模塊提供了與數(shù)據(jù)的連接,但仍然需要自己去拼接 SQL 語(yǔ)句。Python 語(yǔ)法和 SQL 語(yǔ)法、各種引號(hào)、百分號(hào)、轉(zhuǎn)義字符混雜在一起的酸爽,用過(guò)的人都忘不了。
所以實(shí)際開(kāi)發(fā)中,如無(wú)特殊需求,一般不會(huì)直接寫(xiě) SQL,而是用更為方便的 ORM(對(duì)象關(guān)系映射,Object Relational Mapping) 。顧名思義,就是將關(guān)系型數(shù)據(jù)庫(kù)與 Python 中的對(duì)象關(guān)聯(lián)起來(lái),提供了一種操作數(shù)據(jù)的簡(jiǎn)便方式,相當(dāng)于對(duì)數(shù)據(jù)庫(kù)加了一層更友好的接口。
目前 Python 中比較流行的 ORM 解決方案有三種:
Django ORM 。使用方便,但很難脫離 Django 多帶帶使用。
SQLAlchemy 。功能強(qiáng)大,成熟可擴(kuò)展,但學(xué)習(xí)門(mén)檻較高。
peewee 。輕量,可擴(kuò)展,易學(xué)習(xí),但功能有限。
對(duì)于偏初級(jí)的小型項(xiàng)目,通常用不到很復(fù)雜的功能,這時(shí)候 peewee 或許是最好的選擇。今天我們就來(lái)重點(diǎn)介紹下 peewee 這個(gè) Python ORM 庫(kù)。
> 安裝
pip install peewee
> 連接數(shù)據(jù)庫(kù)
以 SQLite 為例:
import peewee db = peewee.SqliteDatabase("people.db") db.connect()
people.db 是 SQLite 的數(shù)據(jù)庫(kù)文件,如果不存在會(huì)自己新建。
如果是 MySQL,要稍微復(fù)雜點(diǎn),需再提供地址、用戶名、密碼等信息,并且必須先手動(dòng)建好庫(kù):
db = peewee.MySQLDatabase("people", host="127.0.0.1", user="root", passwd="", charset="utf8", port=3306)
特別要記住的一點(diǎn)是,代碼進(jìn)行完所有數(shù)據(jù)庫(kù)操作后,要主動(dòng)關(guān)閉數(shù)據(jù)庫(kù):
db.close()
> 創(chuàng)建數(shù)據(jù)類(lèi)型
既然是與對(duì)象關(guān)聯(lián),自然需要以面向?qū)ο蟮姆绞蕉x數(shù)據(jù)結(jié)構(gòu)。我們假定一個(gè)表示人的類(lèi)型 Person,包含姓名 name 和生日 birthday 兩個(gè)字段:
class Person(peewee.Model): class Meta: database = db name = peewee.CharField() birthday = peewee.DateField() Person.create_table()
如果是用過(guò) Django 的同學(xué),對(duì)這個(gè) Model 應(yīng)該非常熟悉了。要注意的就是,需要在 Meta 里定義 database 為前面創(chuàng)建的數(shù)據(jù)庫(kù)。然后使用相應(yīng)的 Field 類(lèi)型定義字段即可。
> 新增數(shù)據(jù)對(duì)象
from datetime import date # 方法1 uncle_bob = Person(name="Bob", birthday=date(1960, 1, 15)) uncle_bob.save() # 方法2 Person.create(name="Crossin", birthday=date(1985, 5, 5))
直接創(chuàng)建數(shù)據(jù)對(duì)象,需要調(diào)用 save 方法保存到數(shù)據(jù)庫(kù)中。而使用 create 方法創(chuàng)建則不用。
> 查找數(shù)據(jù)對(duì)象
bob = Person.get(Person.name == "Bob") print(bob.name, bob.birthday) # 獲取所有數(shù)據(jù) for person in Person.select(): print(person.name)
注意這里的查找條件寫(xiě)法,這與 Django 是不同的。查找還可以用 where 語(yǔ)句,這里不做演示,可以參考官方文檔。
> 修改數(shù)據(jù)對(duì)象
對(duì)于上一步找到的 bob 變量:
bob.name = "Robert" bob.save()
直接向?qū)傩再x值,修改完記得要 save。
> 刪除數(shù)據(jù)對(duì)象
bob.delete_instance()
順便說(shuō)句,一般不建議在數(shù)據(jù)庫(kù)里刪除數(shù)據(jù),因?yàn)閿?shù)據(jù)刪了就不好找回來(lái)了,而且可能還會(huì)引發(fā)關(guān)聯(lián)數(shù)據(jù)的報(bào)錯(cuò)。通常是增加一個(gè) is_deleted 字段標(biāo)記已刪除的內(nèi)容。(所以,不要以為在網(wǎng)上把發(fā)布過(guò)的內(nèi)容刪掉就真的不存在了)
> 創(chuàng)建關(guān)聯(lián)數(shù)據(jù)
在程序中,經(jīng)常會(huì)有一些具有關(guān)聯(lián)關(guān)系的數(shù)據(jù)。比如我們?cè)賱?chuàng)建一個(gè)寵物類(lèi) Pet,每個(gè)寵物有名字 name 和主人 owner。owner 對(duì)應(yīng)的就是我們前面創(chuàng)建的 Person 類(lèi):
class Pet(peewee.Model): class Meta: database = db owner = peewee.ForeignKeyField(Person, backref="pets") name = peewee.CharField()
這樣一來(lái),我們就可以很方便的通過(guò)寵物找到它的主人:
bob_kitty = Pet.create(owner=bob, name="Kitty") bob_fido = Pet.create(owner=bob, name="Fido") print(bob_kitty.owner.name)
也可以找到一個(gè)人養(yǎng)的所有寵物:
for pet in bob.pets: print(pet.name)
以上就是 peewee 的基本操作,如果你了解面向?qū)ο?,?yīng)該不難理解。這些例子取自其官方文檔的快速上手 Quickstart。雖然沒(méi)有像 Requests 那樣貼心地提供中文版,但也同樣足夠人性化。
地址:http://docs.peewee-orm.com/en/latest/peewee/quickstart.html
> 自動(dòng)生成代碼
peewee 提供了一個(gè)功能,可以從已有的數(shù)據(jù)庫(kù)反向生成數(shù)據(jù)模型代碼。以 SQLite 為例:
python -m pwiz -e sqlite people.db > db.py
在你的數(shù)據(jù)庫(kù)文件所在路徑下執(zhí)行這條命令,就可以在 db.py 中自動(dòng)生成代碼。
自動(dòng)生成的代碼
在本專(zhuān)欄先前的案例中,有一些就使用了 peewee。比如 Python 高頻詞匯表 (關(guān)鍵字: 單詞 )和 押韻檢索工具 (關(guān)鍵字: 押韻 )。在本公眾號(hào)( Crossin的編程教室 )里回復(fù)相應(yīng)關(guān)鍵字可查看文章及代碼。
最后提一下,除了使用 ORM 外,對(duì)于數(shù)據(jù)存儲(chǔ)還有一種解決方案,就是使用非關(guān)系型數(shù)據(jù)庫(kù),比如 mongodb 。盡管坑也不少,但對(duì)于簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)來(lái)說(shuō),它有個(gè)巨大的優(yōu)勢(shì)就是 同 Python 內(nèi)置的 dict、list 等類(lèi)型兼容良好 ,可以直接存取,讓你甚至感覺(jué)不到有數(shù)據(jù)庫(kù)的存在,也根本無(wú)需關(guān)心 SQL 語(yǔ)句。爬蟲(chóng)實(shí)戰(zhàn)課程中的部分案例,就選擇了 mongodb 作為數(shù)據(jù)存儲(chǔ)方案。
════
其他文章及回答:
如何自學(xué)Python | 新手引導(dǎo) | 精選Python問(wèn)答 | Python單詞表 | 區(qū)塊鏈 | 人工智能 | 雙11 | 嘻哈 | 爬蟲(chóng) | 排序算法 | 我用Python | 高考 | 世界杯 | requests
歡迎搜索及關(guān)注: Crossin的編程教室
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43263.html
摘要:自己寫(xiě)語(yǔ)句執(zhí)行,這可能是最傻的一種方法了,不過(guò)卻能保證事情完全按照自己的想法執(zhí)行。 遇到的問(wèn)題 golang對(duì)于基本類(lèi)型初始化的處理,是自動(dòng)給基本類(lèi)型賦值為默認(rèn)值。比如: var i int//在這里如果不對(duì)i做任何賦值,那么i的值為零 這個(gè)特性在很多地方能夠避免訪問(wèn)到未初始化變量的尷尬,但是由此也引出了另外一個(gè)問(wèn)題,就是在進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)操作時(shí)應(yīng)該如果對(duì)待這樣的默認(rèn)值。 現(xiàn)在...
摘要:在中,框架的發(fā)布版本包括了個(gè)不同的模塊,每個(gè)模塊會(huì)有個(gè)文件二進(jìn)制類(lèi)庫(kù)源碼的文件以及的文件。所有的模塊都構(gòu)建于核心容器之上。的模塊在模塊中,對(duì)面向切面編程提供了豐富的支持。的模塊提供了為添加代理的功能。測(cè)試提供了測(cè)試模塊以致力于應(yīng)用的測(cè)試。 在Spring 4.0中,Spring框架的發(fā)布版本包括了20個(gè)不同的模塊,每個(gè)模塊會(huì)有3個(gè)JAR文件(二進(jìn)制類(lèi)庫(kù)、源碼的JAR文件以及JavaDo...
摘要:而且關(guān)聯(lián)關(guān)系只需要定義一次就可以了,不需要重復(fù)定義。更新?tīng)顟B(tài)主要是用來(lái)更新,響應(yīng)并發(fā)送到的引用狀態(tài)變化。不能夠在中傳遞參數(shù)執(zhí)行有副作用的操作以及調(diào)用非純函數(shù)。主要是讓容器組件拿到。 Redux-ORM理解之實(shí)現(xiàn)Todo List 一、概念 redux-orm及其作用: redux-orm主要是用來(lái)管理我們的state數(shù)據(jù),當(dāng)一個(gè)項(xiàng)目比較大,邏輯結(jié)構(gòu)比較復(fù)雜,每個(gè)數(shù)據(jù)之間都有聯(lián)系,此時(shí)便...
閱讀 3315·2021-11-12 10:36
閱讀 2467·2021-11-02 14:43
閱讀 2146·2019-08-30 14:23
閱讀 3463·2019-08-30 13:08
閱讀 919·2019-08-28 18:09
閱讀 3129·2019-08-26 12:22
閱讀 3141·2019-08-23 18:24
閱讀 2017·2019-08-23 18:17