聊聊python的轻量级orm peewee及对比SQLAlchemy

其实我是打算自己写个简单的python mysql orm数据库模型,虽然基本功能都实现了,但是bug也不少….   还有这两天正在忙电商数据的导入,因为字段实在太多, 如果用mysqldb、pymysql来操作的话,实在是有些繁琐呀,咱们也不能 insert into xiaorui (col1,col2)values(a,b) …. 

关于peewee模块,原文链接是 http://xiaorui.cc


http://xiaorui.cc/2015/10/09/%E8%81%8A%E8%81%8Apython%E7%9A%84%E8%BD%BB%E9%87%8F%E7%BA%A7orm-peewee%E5%8F%8A%E5%AF%B9%E6%AF%94sqlalchemy/


对于这种繁杂的mysql db操作,大家会选用orm数据模型。现在比较流行的python orm模块有 SQLAlchemy 和 peewee 。  然而sqlalchemy 实在是有些繁重,而peewee更加简单易用了。增曾经在flask平台项目中,使用过peewee做数据的管理,当时因为sql语句里面大量的连表查询和计算,所以后来放弃了。 

Django’s ORM

优点:
易用,学习曲线短
和Django紧密集合,用Django时使用约定俗成的方法去操作数据库

缺点:
QuerySet速度不给力,会逼我用Mysqldb来操作原生sql语句。以前写过一篇关于django orm 跟mysqldb性能的对比

http://xiaorui.cc/2015/09/24/%E8%AF%9D%E8%AF%B4django-orm%E6%A8%A1%E5%9E%8B%E4%B8%BA%E4%BB%80%E4%B9%88%E6%AF%94%E5%8E%9F%E7%94%9F%E7%9A%84mysqldb%E6%85%A2/


跟Django耦合太重了,使得在Django环境外很难使用。

peewee


优点:
Django式的API,使其易用
轻量实现,很容易和任意web框架集成
缺点:
不支持自动化 schema 迁移
不能像Django那样,使线上的mysql表结构生成结构化的模型。

SQLAlchemy


优点:
巨牛逼的API,使得代码有健壮性和适应性
灵活的设计,使得能轻松写复杂查询
缺点:
工作单元概念不常见
重量级 API,导致长学习曲线

废话不多少,咱们先简单走走peewee的例子。

pip install peewee

下面是个完整的例子。 

# models.py
import peewee
 
database = peewee.SqliteDatabase("wee.db")
 
########################################################################
class Artist(peewee.Model):
    # name 是 字符串格式
    name = peewee.CharField()
 
    class Meta:
        database = database
        # 指定database
########################################################################
class Album(peewee.Model):  
    title = peewee.CharField()
    release_date = peewee.DateTimeField()   # datetime类型
    publisher = peewee.CharField()
    media_type = peewee.CharField()
    artist = peewee.ForeignKeyField(Artist)   # 外键
    class Meta:
        database = database
 
 
if __name__ == "__main__":
    try:
        Artist.create_table()    #创建表
    except peewee.OperationalError:
        print "Artist table already exists!"
 
    try:
        Album.create_table()
    except peewee.OperationalError:
        print "Album table already exists!"

官方是peewee操作sqlite的例子,我这再说说mysql的连接的例子。

#xiaorui.cc
from peewee import *

db = peewee.MySQLDatabase("...", host="localhost", user="fengyun",passwd="xiaorui.cc")

class MySQLModel(peewee.Model):
    class Meta:
        database = db

class Active_Users(MySQLModel):
    user_id = peewee.CharField(primary_key=True)
    device_token = peewee.CharField()

db.connect()

下面是使用peewee添加数据的例子,其实他的用法跟django orm差不多,一般来说只要用过django orm的人,会立马上手的。 

# add_data.py
 
import datetime
import peewee
 
from models import Album, Artist
 
new_artist = Artist.create(name="Newsboys")
album_one = Album(artist=new_artist,
                  title="Read All About It",
                  release_date=datetime.date(1988,12,01),
                  publisher="Refuge",
                  media_type="CD")
album_one.save()
# 批量添加数据,把数据放到列表里面就可以了 
albums = [{"artist": new_artist,
           "title": "Hell is for Wimps",
           "release_date": datetime.date(1990,07,31),
           "publisher": "Sparrow",
           "media_type": "CD"
           },
          {"artist": new_artist,
           "title": "Love Liberty Disco", 
           "release_date": datetime.date(1999,11,16),
           "publisher": "Sparrow",
           "media_type": "CD"
          },
          {"artist": new_artist,
           "title": "Thrive",
           "release_date": datetime.date(2002,03,26),
           "publisher": "Sparrow",
           "media_type": "CD"}
          ]
 
for album in albums:
    a = Album(**album)
    a.save()
 
bands = ["MXPX", "Kutless", "Thousand Foot Krutch"]
for band in bands:
    artist = Artist.create(name=band)
    artist.save()

peewee更改数据

# edit_data.py
 
import peewee
 
from models import Album, Artist
 # select语句
band = Artist.select().where(Artist.name=="Kutless").get()
print band.name
 

band = Artist.get(Artist.name=="Kutless")
print band.name
 
# 更改数据
band.name = "Beach Boys"
band.save()
 # 连表查询,peewee也支持join语句
album = Album.select().join(Artist).where(
    (Album.title=="Thrive") & (Artist.name == "Newsboys")
    ).get()
album.title = "Step Up to the Microphone"
album.save()

peewee删除数据

# del_data.py
 
from models import Artist
 
band = Artist.get(Artist.name=="MXPX")
band.delete_instance()

这里再介绍个新功能,使用peewee根据mysql数据库生成模型。 

python -m pwiz -e mysql -H localhost -p3306 -uroot -Pxiaorui  xiaorui > db.py

今天就简单聊下peewee的功能 ,过两天我会分享下peewee的高级功能。


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

发表评论

电子邮件地址不会被公开。 必填项已用*标注