04 | 在tornado中 使用peewee作為orm


安裝

pip install peewee  

github 地址

https://github.com/coleifer/peewee 

官方文檔(文檔寫的很詳細,建議讀一遍)

http://docs.peewee-orm.com/en/latest/

  

使用 peewee創建模型類

 實例化一個 數據庫的實例 db ,要在Meta 中指定

 models/model.py

from datetime import datetime

from peewee import *
from peewee import Model

db = MySQLDatabase('message', host="127.0.0.1", port=3306, user="root", password="mysql")


class BaseModel(Model):
    add_time = DateTimeField(default=datetime.now, verbose_name="添加時間")
    class Meta:
        database = db

class Supplier(BaseModel):
    name = CharField(max_length=100, verbose_name="名稱", index=True)
    address = CharField(max_length=100, verbose_name="聯系地址")
    phone = CharField(max_length=11, verbose_name="聯系方式")
    class Meta:
        database = db
        table_name = "supplier"

class Goods(BaseModel):
    supplier = ForeignKeyField(Supplier, verbose_name="商家", backref="goods")
    name = CharField(max_length=100, verbose_name="商品名稱", index=True)
    click_num = IntegerField(default=0, verbose_name="點擊數")
    goods_num = IntegerField(default=0, verbose_name="庫存數")
    price = FloatField(default=0.0, verbose_name="價格")
    brief = TextField(verbose_name="商品簡介")

    class Meta:
        table_name = "goods"


def init_table():
    db.create_tables([Goods, Supplier])
    
if __name__ == "__main__":
    init_table()

 

 運行該腳本,數據庫中多了兩張表

 

 要添加的數據data.py

supplier_list = [
    {
        "name":"淘寶",
        "address":"杭州市",
        "phone":"18888888888"
    },
    {
        "name":"京東",
        "address":"上海市",
        "phone":"17777777777"
    },
    {
        "name":"天貓",
        "address":"北京市",
        "phone":"16666666666"
    }
]

goods_list = [
    {
        "supplier":1,
        "name": "52度茅台集團國隆雙喜酒500mlx6",
        "click_num": 100,
        "goods_num": 666,
        "price": 128,
        "brief": "貴州茅台酒廠(集團)保健酒業有限公司生產,是以“龍”字打頭的酒水。中國龍文化上下8000年,源遠而流長,龍的形象是一種符號、一種意緒、一種血肉相聯的情感。"
    },
    {
        "supplier":2,
        "name": "52度水井坊臻釀八號500ml",
        "click_num": 585,
        "goods_num": 288,
        "price": 36,
        "brief": "貴州茅台酒廠(集團)保健酒業有限公司生產,是以“龍”字打頭的酒水。中國龍文化上下8000年,源遠而流長,龍的形象是一種符號、一種意緒、一種血肉相聯的情感。"
    },
    {
        "supplier":3,
        "name": "53度茅台仁酒500ml",
        "click_num": 553,
        "goods_num": 280,
        "price": 190,
        "brief": "貴州茅台酒廠(集團)保健酒業有限公司生產,是以“龍”字打頭的酒水。中國龍文化上下8000年,源遠而流長,龍的形象是一種符號、一種意緒、一種血肉相聯的情感。"
    },
    {
        "supplier":1,
        "name": "茅台53度飛天茅台500ml",
        "click_num": 48,
        "goods_num": 20,
        "price": 22,
        "brief": "貴州茅台酒廠(集團)保健酒業有限公司生產,是以“龍”字打頭的酒水。中國龍文化上下8000年,源遠而流長,龍的形象是一種符號、一種意緒、一種血肉相聯的情感。"
    },
    {
        "supplier":2,
        "name": "芝華士12年蘇格蘭威士忌700ml",
        "click_num": 31,
        "goods_num": 15,
        "price": 88,
        "brief": "貴州茅台酒廠(集團)保健酒業有限公司生產,是以“龍”字打頭的酒水。中國龍文化上下8000年,源遠而流長,龍的形象是一種符號、一種意緒、一種血肉相聯的情感。"
    }
]
View Code

 

peewee_test.py  向數據庫中插入數據 

from models.model import Supplier, Goods
from data import supplier_list, goods_list

def save_model():
    for data in supplier_list:
        supplier = Supplier()
        supplier.name = data["name"]
        supplier.address = data["address"]
        supplier.phone = data["phone"]

        supplier.save()

    for data in goods_list:
        good = Goods(**data)
        good.save()

if __name__ == "__main__":
    save_model()

 運行腳本,查看數據庫

 

 

 peewee_test.py  查詢數據

from models.model import Supplier, Goods
from data import supplier_list, goods_list
def query_model():
    #獲取某一條數據
    #good = Goods.get(Goods.id==1)
    good = Goods.get_by_id(1)
    good = Goods[1]

    #select 返回的是modelselect對象
    #獲取所有數據
    # select price from goods
    goods = Goods.select(Goods.name, Goods.price) # 懶加載,只有在迭代的時候才會查詢數據庫

    # select * from goods where price > 100
    goods = Goods.select().where(Goods.price>100)

    #select * from goods where price>100 and click_num>200
    goods = Goods.select().where((Goods.price>100)|(Goods.click_num>200))

    #select * from goods where name like "%飛天"
    goods = Goods.select().where(Goods.name.contains("飛天"))

    goods = Goods.select().where(Goods.id<<[1,3])
    goods = Goods.select().where((Goods.id==1)|(Goods.id==3))
    goods = Goods.select().where((Goods.id.in_([1,3])))


    #select * from goods where price>click_num
    goods = Goods.select().where(Goods.price>Goods.click_num)

    #排序 select * from goods order by price desc
    goods = Goods.select().order_by(Goods.price.asc())
    goods = Goods.select().order_by(Goods.price)

    #分頁
    goods = Goods.select().order_by(Goods.price).paginate(2, 2)
    for good in goods:
        print(good.price)


if __name__ == "__main__":
    query_model()

 

 peewee_test.py  更新

在更新的時候要執行execute 懶加載,讓它立即執行

from models.model import Supplier, Goods
from data import supplier_list, goods_list

from peewee import ModelUpdate
def update_model():
    try:
        # update click_num=100 where id =1
        Goods.update(click_num=Goods.click_num+1).where(Goods.id==1).execute()

        good = Goods.get_by_id(1)
        good.click_num += 1
        good.save()

    except Goods.DoesNotExist:
        pass


if __name__ == "__main__":
    update_model()

 

peewee_test.py  刪除

在更新的時候要執行execute 懶加載,讓它立即執行

from models.model import Supplier, Goods
from data import supplier_list, goods_list

from peewee import ModelUpdate
def update_model():
        # 刪除
        good = Goods.get_by_id(1)
        good.delete_instance()
        # delete from goods where price>150
        Goods.delete().where(Goods.price > 150).execute()


if __name__ == "__main__":
    update_model()

 

通過peewee-async集成到tornado中

之所以集成peewee-async是因為peewee中存在大量的同步方法 execute (比如在更新和保存,刪除),而我們需要異步的方法,peewee-async 中由asyncio提供的peewee ORM的異步接口,可以直接在tornado中使用 

安裝 peewee-async 

pip install --pre peewee-async 

 gihub 地址

https://github.com/05bit/peewee-async

  

根據官方文檔改寫models/model.py

from datetime import datetime

from peewee import *
from peewee import Model
import peewee_async

database = peewee_async.MySQLDatabase(
    'message', host="127.0.0.1", port=3306, user="root", password="mysql"
)

objects = peewee_async.Manager(database)

# No need for sync anymore!


database.set_allow_sync(False)


class BaseModel(Model):
    add_time = DateTimeField(default=datetime.now, verbose_name="添加時間")
    class Meta:
        database = database

class Supplier(BaseModel):
    name = CharField(max_length=100, verbose_name="名稱", index=True)
    address = CharField(max_length=100, verbose_name="聯系地址")
    phone = CharField(max_length=11, verbose_name="聯系方式")
    class Meta:
        database = database
        table_name = "supplier"

class Goods(BaseModel):
    supplier = ForeignKeyField(Supplier, verbose_name="商家", backref="goods")
    name = CharField(max_length=100, verbose_name="商品名稱", index=True)
    click_num = IntegerField(default=0, verbose_name="點擊數")
    goods_num = IntegerField(default=0, verbose_name="庫存數")
    price = FloatField(default=0.0, verbose_name="價格")
    brief = TextField(verbose_name="商品簡介")

    class Meta:
        table_name = "goods"


def init_table():
    db.create_tables([Goods, Supplier])
if __name__ == "__main__":
    init_table()

 

peewee_async_test.py

import asyncio

from chapter04.models.model import Goods
from chapter04.models.model import objects


async def handler():
    await objects.create(Goods, supplier_id=1, name="53度水井坊臻釀八號500ml",
                         click_num=20, goods_num=1000, price=500, brief="州茅台酒廠(集團)保健酒業有限公司生產")
    goods = await objects.execute(Goods.select())
    for good in goods:
        print(good.name)

loop = asyncio.get_event_loop()
loop.run_until_complete(handler())

輸出結果如下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM