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

对于这种繁杂的mysql db操作,大家会选用orm数据模型。现在比较流行的python orm模块有 SQLAlchemy 和 peewee 。 然而sqlalchemy 实在是有些繁重,而peewee更加简单易用了。增曾经在flask平台项目中,使用过peewee做数据的管理,当时因为sql语句里面大量的连表查询和计算,所以后来放弃了。
Django’s ORM
优点:
易用,学习曲线短
和Django紧密集合,用Django时使用约定俗成的方法去操作数据库
缺点:
QuerySet速度不给力,会逼我用Mysqldb来操作原生sql语句。以前写过一篇关于django orm 跟mysqldb性能的对比
跟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的高级功能。
