1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python的輕量級(jí)ORM框架peewee

        共 5383字,需瀏覽 11分鐘

         ·

        2021-03-03 22:16


        專欄作者:小小明

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

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

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

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

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

        它的安裝非常簡(jiǎn)單:

        pip install peewee

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

        peewee.ImproperlyConfigured: MySQL driver not installed!

        則需要安裝一個(gè)mysql的驅(qū)動(dòng):

        pip install pymysql

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

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

        下面測(cè)試一下各項(xiàng)功能:

        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(19961220), is_relative=True)
            p.save()


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


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

            # 更新birthday數(shù)據(jù)
            q = Person.update({Person.birthday: date(19831221)}).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)

        下面測(cè)試一個(gè)各個(gè)方法。

        測(cè)試創(chuàng)建表:

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

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

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

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

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

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

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

        結(jié)果:

        小華 1996-12-20 True

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

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

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

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

        if __name__ == "__main__":
            p = Person(name='小新', birthday=date(1995620), is_relative=False)
            p.save()
            # 更新birthday數(shù)據(jù)
            q = Person.update({Person.birthday: date(1983521)}).where(Person.name == '小新')
            q.execute()

        執(zhí)行后:

        測(cè)試批量查詢:

        if __name__ == "__main__":
            for i in range(15):
                p = Person(name=f'小張{i}', birthday=date(1995620), 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

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

        — 【 THE END 】—
        本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲取!


        3T技術(shù)資源大放送!包括但不限于:Java、C/C++,Linux,Python,大數(shù)據(jù),人工智能等等。在公眾號(hào)內(nèi)回復(fù)「1024」,即可免費(fèi)獲取??!




        瀏覽 52
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲欧美中文日韩在线v日本野外 | 首页操逼| 久久性爱视频网 | 日韩一级黄色 | 伊人成人在线视频 | 小雪公交车被进去高潮的故事 | 无码破解一区二区三区在线播报 | 久久久久亚洲ai毛片换脸星大全 | 大香蕉最新地址 | 国产美女A片 |