作者:Each+ Apollo
设置模型使用的数据库,可以通过继承设置。也就意味着我们可以写一个基本的model,然后其他model都继承自这个基本model。
class UserModel(Model):
class Meta:
database = MySQLDatabase('my_database')
设置表名,不可以通过继承设置。如果不想使用默认值,每个model在编写时需要手动设置
class UserModel(Model):
class Meta:
table_name = 'user_table'
可以设置一个函数用来动态生成表名的功能。可以通过继承设置。
def make_table_name(model_class):
model_name = model_class.__name__
return model_name.lower() + '_tbl'
class BaseModel(Model):
class Meta:
table_function = make_table_name
class User(BaseModel):
# table_name will be "user_tbl".
class UserProfile(BaseModel):
# table_name will be "userprofile_tbl".
设置要索引的字段列表,可以设置联合索引,类似Django的联合索引设置。可以通过继承设置。
class Transaction(Model):
from_acct = CharField()
to_acct = CharField()
amount = DecimalField()
date = DateTimeField()
class Meta:
indexes = (
# create a unique on from/to/date
(('from_acct', 'to_acct', 'date'), True),
# create a non-unique on from/to
(('from_acct', 'to_acct'), False),
)
设置复合主键。可以通过继承设置。
class BlogToTag(Model):
"""A simple "through" table for many-to-many relationship."""
blog = ForeignKeyField(Blog)
tag = ForeignKeyField(Tag)
class Meta:
primary_key = CompositeKey('blog', 'tag')
设置表约束列表。可以通过继承设置。
class Person(Model):
first = CharField()
last = CharField()
class Meta:
primary_key = CompositeKey('first', 'last')
class Pet(Model):
owner_first = CharField()
owner_last = CharField()
pet_name = CharField()
class Meta:
constraints = [SQL('FOREIGN KEY(owner_first, owner_last) '
'REFERENCES person(first, last)')]
主键id从多少起
auto_id_baes = 10000
CharField、FixedCharField:
DateTimeField、DateField、TimeField:
formats = ‘%Y-%m-%d %H:%M:%S’ 设置日期时间的格式化,最常用的格式化。
formats = ‘%Y-%m-%d’ 设置日期的格式化,最常用的格式化。
DecimalField:
ForeignKeyField:
设置当被引用的记录删除时,指向该记录的数据操作,存在多个可选值:
CASCADE 跟随外键一同删除
RESTRICT 限制外表中的数据删除,就是当外键删除时,检测到有指向该外键的数据,那么就不允许删除。
SET NULL 设置空值
SET DEFAULT 设置默认值
NO ACTION 不做操作,默认的
ManyToManyField:对于这个字段,由于peewee支持的不是很好,建议需要多对多model设计时,使用ForeignKeyField建立第三方表实现。
找到了会返回model实例,未找到会抛出异常DoesNotExist
mgr.get(Model, id=1, name='haha')
mgr.get(Model, Model.id == 1, Model.name == 'haha')
mgr.get(Model.select('id').where(Model.id == 1)) # 指定查询某些字段
成功的话返回obj对象,如果参数不填写,会默认‘’
mgr.create(Model, name='hahaha', sort=999)
成功的话返回obj对象,only默认是None,也可以是只修改字段的列表或数组
mgr.update(obj, only=None) # 传入的obj是模型实例
返回删除条数
mgr.delete(obj)
查询符合某些条件并取出第一个对象,若不存在创建
返回二元数组,第一位是obj对象,第二位是bool,true是新建,false是查询
mgr.get_or_create(Model, defaults=dict(sort=123), name='abcdefg')
直接创建对象,如果存在,则查找并返回
返回二元数组,第一位是obj对象,第二位是bool,true是新建,false是查询
mgr.create_or_get(Model, name='abcdefg', sort=321, id=75)
prefetch(par_query, *subquerys)
mgr.prefetch(
School.select().where((School.id >= 8) & (School.id <= 10)),
Class.select(Class.id, Class.school_id),
)
for o in obj:
print('学校>>', o.name, o.id)
for j in o.class_set:
print('班级>>', j.name, j.id)
mgr.count(Model.select())
获取第一个模型对象信息,没有则返回None
as_tuple: True返回对象的所有字段值得元组,False返回元组的第一个值,默认False
mgr.scalar(Model.select(), as_tuple=False)
with mgr.allow_sync():
Model.create_table(True)
try:
async with mgr.atomic() as tran:
mgr.execute(ThatModel.insert(...))
mgr.execute(ThatModel.update(...))
except Exception as ex:
logger.exception(ex)
mgr.execute(Model.select())
mgr.close()
Model.create_table(True)
和create区别是,insert不返回模型实例,只返回id
mgr.execute(
Model.insert(name='jiojliower', sort=99999)
)
insert_many([data1, data2, data3.....]),返回插入的第一条数据的id
obj = await mgr.execute(
Model.insert_many([
dict(name='poiuj', sort=99997),
dict(name='oiuerte', sort=99996),
])
)
返回实际更新的条数
obj = await mgr.execute(
School.update(
name='9809808'
)
)
新增一条数据,若违反索引或约束等,则替换数据
obj = await mgr.execute(
Model.replace(
name=‘12313189’
)
)
返回删除的条数
obj = await mgr.execute(
School.delete().where(
School.name=='12313189'
)
)
返回实例对象迭代器
obj = await request.app.mgr.execute(
Model.select()
)
方法 含义
返回字典对象迭代器
obj = await mgr.execute(
School.select(School.id, School.name).where(School.id >= 90).dicts()
)
obj = await mgr.execute(
School.select(School.id, School.name).where(School.id >= 90).tuples()
)
会一并查询school的所有字段,若只想查school的某个字段,可以用School.id等
连接方式有
obj = await mgr.execute(
Class.select(Class.id, School).join(School, JOIN.LEFT_OUTER, on=(Class.school_id == School.id))
)
方法 意义
要使用逻辑运算符组合子句,请使用:
(User.is_active == True) & (User.is_admin == True)
(User.is_admin) | (User.is_superuser)
~(User.username.contains('admin'))
Rand(Mysql)和Random(Sqlite)随机排序
obj = await mgr.execute(
School.select().order_by(
School.id.desc(),
School.name
)
)
order_by(fn.Rand())
obj = await mgr.execute(
School.select().paginate(page_id, page_size)
)
obj = await mgr.execute(
School.select().count()
)
obj = await mgr.execute(
School.select().group_by(School.name).having(fn.COUNT(School.name) > 50)
)
School.raw('SELECT * FROM my_table WHERE data = %s and id = %s', user_data, user_id)
mgr.execute(
SenderReceiverInfo.select(SenderReceiverInfo.info_id) | DeliveryOrder.select(DeliveryOrder.sender_info_id.alias('info_id'))
)
第几个开始,取几个,1是第一个
School.select(
).where(
fn.Substr(School.name, 1, 6) == 'zxcvbv'
)
from peewee import Tuple
School.select(
).where(
Tuple(School.id, School.name) == (9, 'jijio')
)