国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

ORM-像對(duì)象一樣對(duì)待數(shù)據(jù)

U2FsdGVkX1x / 740人閱讀

摘要:顧名思義,就是將關(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ù),還有 picklecsv 等模塊輔助。但對(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

相關(guān)文章

  • 使用golang在與數(shù)據(jù)庫(kù)訪問(wèn)過(guò)程中的一點(diǎn)想法

    摘要:自己寫(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)在...

    channg 評(píng)論0 收藏0
  • Spring 的模塊組成

    摘要:在中,框架的發(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...

    sumory 評(píng)論0 收藏0
  • Redux-ORM理解之實(shí)現(xiàn)Todo List

    摘要:而且關(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í)便...

    YacaToy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<