<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 輕量級ORM框架peewee

          共 3425字,需瀏覽 7分鐘

           ·

          2021-02-17 07:16


          專欄作者:小小明

          非常擅長解決各類復(fù)雜數(shù)據(jù)處理的邏輯,各類結(jié)構(gòu)化與非結(jié)構(gòu)化數(shù)據(jù)互轉(zhuǎn),字符串解析匹配等等。至今已經(jīng)幫助很多數(shù)據(jù)從業(yè)者解決工作中的實際問題,如果你在數(shù)據(jù)處理上遇到什么困難,歡迎評論區(qū)與我交流。

          在前面的《改變python對象規(guī)則的黑魔法metaclass》一文中,我介紹了使用metaclass自己編寫ORM框架的思路。

          當(dāng)然python庫中這類框架非常多,我們并沒有必要自己去實現(xiàn)。

          ORM框架使用最廣泛的就是SQLAlchemy和Django自帶的ORM框架,但是SQLAlchemy的語法顯然相對Django的ORM框架麻煩一點。

          而Django本身是一個web框架,比較重量級,僅僅為了使用Django的ORM框架的功能,而安裝Django有點導(dǎo)致系統(tǒng)臃腫。而peewee這個框架語法幾乎與Django的ORM框架一致,而又非常輕量。

          它的安裝非常簡單:

          pip?install?peewee

          如果你在使用mysql數(shù)據(jù)庫的過程中報出如下錯誤:

          peewee.ImproperlyConfigured:?MySQL?driver?not?installed!

          則需要安裝一個mysql的驅(qū)動:

          pip?install?pymysql

          peewee的whl包是880kB,pymysql的whl包是51KB,非常輕量級。

          peewee的官方文檔地址:http://docs.peewee-orm.com/en/latest/index.html

          下面測試一下各項功能:

          from?peewee?import?*

          db?=?MySQLDatabase('test',?host="localhost",?user='root',?passwd='123456',?port=3306)


          #?定義Person
          class?Person(Model):
          ????name?=?CharField()
          ????birthday?=?DateField()
          ????is_relative?=?BooleanField()

          ????class?Meta:
          ????????database?=?db
          ????????
          def?test_create():
          ????Person.create_table()
          ????#?創(chuàng)建多張表也可以這樣
          ????#?database.create_tables([Person])


          def?test_insert():
          ????#?添加一條數(shù)據(jù)
          ????p?=?Person(name='小華',?birthday=date(1996,?12,?20),?is_relative=True)
          ????p.save()


          def?test_delete():
          ????#?刪除姓名為perter的數(shù)據(jù)
          ????Person.delete().where(Person.name?==?'perter').execute()
          ????#?已經(jīng)實例化的數(shù)據(jù),?使用delete_instance
          ????p?=?Person(name='小華',?birthday=date(1996,?12,?20),?is_relative=False)
          ????p.id?=?1
          ????p.save()
          ????p.delete_instance()


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

          ????#?更新birthday數(shù)據(jù)
          ????q?=?Person.update({Person.birthday:?date(1983,?12,?21)}).where(Person.name?==?'小華')
          ????q.execute()


          def?test_query():
          ????#?查詢單條數(shù)據(jù)
          ????p?=?Person.get(Person.name?==?'小華')
          ????print(p.name,?p.birthday,?p.is_relative)

          ????#?使用where().get()查詢
          ????p?=?Person.select().where(Person.name?==?'小華').get()
          ????print(p.name,?p.birthday,?p.is_relative)

          ????#?查詢多條數(shù)據(jù)
          ????persons?=?Person.select().where(Person.is_relative?==?True)
          ????for?p?in?persons:
          ????????print(p.name,?p.birthday,?p.is_relative)

          下面測試一個各個方法。

          測試創(chuàng)建表:

          if?__name__=="__main__":
          ????Person.create_table()

          執(zhí)行完畢,檢查數(shù)據(jù)庫成功創(chuàng)建下面這張表:

          測試插入數(shù)據(jù):

          if?__name__=="__main__":
          ????p?=?Person(name='小華',?birthday=date(1996,?12,?20),?is_relative=True)
          ????p.save()

          執(zhí)行完畢后,表數(shù)據(jù)多了一行:

          測試查詢數(shù)據(jù):

          if?__name__=="__main__":
          ?p?=?Person.get(Person.name?==?'小華')
          ????print(p.name,?p.birthday,?p.is_relative)

          結(jié)果:

          小華?1996-12-20?True

          測試刪除數(shù)據(jù):

          if?__name__=="__main__":
          ????Person.delete().where(Person.name?==?'小華').execute()

          執(zhí)行后,數(shù)據(jù)庫對應(yīng)的記錄被刪除:

          測試修改數(shù)據(jù):

          if?__name__?==?"__main__":
          ????p?=?Person(name='小新',?birthday=date(1995,?6,?20),?is_relative=False)
          ????p.save()
          ????#?更新birthday數(shù)據(jù)
          ????q?=?Person.update({Person.birthday:?date(1983,?5,?21)}).where(Person.name?==?'小新')
          ????q.execute()

          執(zhí)行后:

          測試批量查詢:

          if?__name__?==?"__main__":
          ????for?i?in?range(1,?5):
          ????????p?=?Person(name=f'小張{i}',?birthday=date(1995,?6,?20),?is_relative=False)
          ????????p.save()
          ????#?查詢多條數(shù)據(jù)
          ????persons?=?Person.select().where(Person.is_relative?==?False)
          ????for?p?in?persons:
          ????????print(p.name,?p.birthday,?p.is_relative)

          執(zhí)行后:

          結(jié)果:

          小新?1983-05-21?False
          小張1?1995-06-20?False
          小張2?1995-06-20?False
          小張3?1995-06-20?False
          小張4?1995-06-20?False

          更多用法可參考官方文檔。

          我們的文章到此就結(jié)束啦,如果你喜歡今天的Python 實戰(zhàn)教程,請持續(xù)關(guān)注Python實用寶典。

          有任何問題,可以在公眾號后臺回復(fù):加群,回答相應(yīng)紅字驗證信息,進入互助群詢問。

          原創(chuàng)不易,希望你能在下面點個贊和在看支持我繼續(xù)創(chuàng)作,謝謝!

          點擊下方閱讀原文可獲得更好的閱讀體驗

          Python實用寶典?(pythondict.com)
          不只是一個寶典
          歡迎關(guān)注公眾號:Python實用寶典

          瀏覽 47
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  青青草91在线视频 | 亚洲精品suv视频 | 国产内射免费观看视频 | 人人做天天摸夜夜添成人 | 国产精品久久久久久久午夜 |