其实我是打算自己写个简单的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的高级功能。