基础
创建数据库管理对象
from peewee import *
db = MySQLDatabase('test_db', user='root', password='password', host='localhost', port=3306)
定义自己的模型
class User(Model):
uid = AutoField() # 自增主键
name = CharField(max_length=20)
age = IntegerField(default=0)
address = CharField(null = True) # 允许空
class Meta:
# 关联数据库,这是必选的
database = db
# 设置 编写和排序规则,这是可选的
# table_settings = ["DEFAULT CHARSET=utf8mb4", "COLLATE=utf8mb4_unicode_ci"]
连接数据库并创建表
# 连接数据库
db.connect()
# 往数据库创建表
db.create_tables([User, MyMeta])
插入数据
# 往数据库插入一条数据
User.create(name = 'yao7777', age = 18)
# 通过字典插入
userInfo = {'name':'yao888', 'age': 28}
User.insert(userInfo).execute()
查询数据
users = User.select() # 获取所有用户信息
for user in users:
print(user.name, user.age)
users = User.select().where(User.name == 'yao7777') # 条件查询
users = User.select().where(User.name == 'yao7777', User.age == 18) # 多条件查询(AND)
user = User.get_by_id(2) # 如果数据不存在会崩溃
user = User.get_or_none(User.uid == 900) # 如果数据不存在,返回 None
if user:
print(user.name)
更新数据
users = User.select()
user = users[0]
user.age = 28
user.address = '广东广州'
user.save()
删除数据
users = User.select()
user = users[0]
# 删除一条数据
user.delete_instance()
# 删除表和数据
User.drop_table()
# 删除表数据
User.delete().execute()
进阶
复合主键模型示例
class Relation(Model):
'''
关联数据
'''
rid = IntegerField()
'''
仓库 ID
'''
mid = IntegerField()
'''
数据元 ID
'''
star = IntegerField(default = 0)
'''
本期 star
'''
starPrev = IntegerField(default = 0)
'''
上期 star
'''
class Meta:
database = db
primary_key = CompositeKey('rid', 'mid') # 2个主键
复杂查询示例(以Relation模型为例)
查找指定 mid
的所有数据,且排序按照 (star
- starPrev
) 的差值降序
relation = Relation.select(Relation.rid, Relation.star, (Relation.star - Relation.starPrev).alias('offsetStar')).order_by(SQL('offsetStar').desc()).where(Relation.mid == meta.id)
offsetStar
是给 (star
- starPrev
) 差值起的别名
数据库断线自动重连
默认情况下Peewee不会自动重连,当数据库重启后,由于没有重连机制,此时Peewee的连接已丢失,操作数据库会导致崩溃。
要启用自动重连机制,要改动一下代码
db = MySQLDatabase('test_db', user='root', password='password', host='localhost', port=3306)
改为
from playhouse.shortcuts import ReconnectMixin
# 断线重连
class ReconnectMySQLDatabase(ReconnectMixin, MySQLDatabase):
pass
db = ReconnectMySQLDatabase('xxx', user='root', password='你的pwd', host='188.x.x.x', port=3306)
还不快抢沙发