peewee 使用
最近在写一个运维平台,开始因为项目比较着急,而且经验不足,所以直接用的 MySQLdb模块连接的数据库。对于我这种不善于写sql的人来说,是个很悲剧的事情。后来,发现了python的orm框架,在选择框架的时候,听从了,沈灿大哥的建议 选择了peewee 来操作数据库。
废话少说。。来进行操作吧。
#首先来说下数据库的连接,我们一般用到的都是mysql数据库,所以我这里也用mysql数据库做例子
db_connect = MySQLDatabase(host='host', user='username', passwd='password', database='db_name',
charset='utf8')
这就是数据库的连接。但是,在使用的时候,一定要记住关闭连接。
db_connect.connect() #开启连接
db_connect.close() #关闭连接
数据库的操作
我们数据库已经连接好了,现在该开始操作数据库了
首先我们要建立一个表的结构。
如果用sql建立一个包含 id,name,passwd 字段的user表,该怎么做呢?
create table user (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id,主键',
`name` VARCHAR (50) NOT NULL DEFAULT '' COMMENT '名称',
`name` VARCHAR (50) NOT NULL DEFAULT '' COMMENT '密码',)
那如果用peewee应该怎么做呢?
db_connect = MySQLDatabase(host='host', user='username', passwd='password', database='db_name',
charset='utf8')
class user(Model):
id = IntegerField() #int 数据类型
name = CharField() #varchar 可变字符串
passwd = CharField()
class Meta:
database = db
db_connect.connect()
user.create_table()
db_connect.close()
就这样,一个表就建立好了。
大家在创建mysql表的时候,会有很多的数据类型。那么peewee和mysql数据类型是怎么做映射的呢?
下面就是官方文档的一个对应关系表格。。
Field TypeSqlitePostgresqlMySQL
CharFieldvarcharvarcharvarchar
FixedCharFieldcharcharchar
TextFieldtexttextlongtext
DateTimeFielddatetimetimestampdatetime
IntegerFieldintegerintegerinteger
BooleanFieldsmallintbooleanbool
FloatFieldrealrealreal
DoubleFieldrealdouble precisiondouble precision
BigIntegerFieldintegerbigintbigint
DecimalFielddecimalnumericnumeric
PrimaryKeyFieldintegerserialinteger
ForeignKeyFieldintegerintegerinteger
DateFielddatedatedate
TimeFieldtimetimetime
BlobFieldblobbyteablob
UUIDFieldnot supporteduuidnot supported
现在进行数据库的增删改查
添加数据
User.create(name=name,password=password)
对应sql
insert into user (name,password) value (name,password)
删除数据
user.delete_instances()
修改数据
#更新多个(将a打头的用户的value全部更新为1)
User.update(value = 1).where(User.name ** 'A%').execute()
对应sql
update user set value = 1 where name like "%A%"
查询数据
user.select() #遍历数据
条件查询
user.select().where(id = 1)
排序
user.select().order_by(user.id.desc())
对应sql
select * from user order by id desc
去重
user.select().group_by(user.id).distinct(user.name)
对应sql
select * from user group by id distinct name
多表联合查询
user.select().join(group).order_by(group.username, user.name.desc())
对应sql
SELECT t1."id", t1."user", t1."passwd""
FROM "user" AS t1
INNER JOIN "group" AS t2
ON t1."id" = t2."id"
ORDER BY t2."username", t1."name" DESC
批量插入数据
data = {'name':'auga','age':'27'}
user.create(**data)
批量插入数据时,如果出现多余的Key 不会影响正常数据的插入
批量更新数据
data = {'name':'auga','age':'27'}
user.update(**data).where(user.id == 1).execute()
批量插入数据时。数据中的key必须与表的字段相对。只可以少,不可以多。。
好了,其他的大家就去看下官方文档吧。
http://peewee.readthedocs.org/en/latest/peewee/querying.html#selecting-a-single-record
在下才疏学浅。。。。刚学到这些,以后会补充的