create 的用法讲解
create 里如果没给字段赋值,那么所有字段都会是默认值
from peewee import *
class AgileJobModel(Model):
"""
agile任务表
"""
AGILE_PIPELINE_JOB_BUILD_ID = BigIntegerField(
primary_key=True, null=False, verbose_name='agile任务ID')
这个截图, 是表示 当前 数据库里 相关记录 0 和 644491924 并不存在
测试代码
if __name__ == '__main__':
model = AgileJobModel()
model.AGILE_PIPELINE_JOB_BUILD_ID = 644491924
model.create()
执行上述代码后, 预期 存入 的记录 是 644491924, 实际是 0
所以结论是:
create 没有参数,后果是 所有字段都会是默认值
正确使用 create
if __name__ == '__main__':
model = AgileJobModel()
model.create(AGILE_PIPELINE_JOB_BUILD_ID=644491924)
代码也可以这么写
if __name__ == '__main__':
model = AgileJobModel()
model.AGILE_PIPELINE_JOB_BUILD_ID = 644491924
# model.其他字段 = value
model.create(**model.__data__)
save 的用法讲解
这个截图, 是表示 当前 数据库里 相关记录 0 和 644491924 并不存在
if __name__ == '__main__':
model = AgileJobModel()
model.AGILE_PIPELINE_JOB_BUILD_ID = 644491924
model.save()
代码执行后,并没有如预期一样,插入数据 644491924
因为, 当 AgileJobModel 的primary key 字段有值时, model 类 会认为数据库里面已经有对应的记录, 此时 peewee 执行的是 update 操作
当 primary key 有值时, 如果想让 model 执行 insert , 需要增加参数控制, 如下:
if __name__ == '__main__':
model = AgileJobModel()
model.AGILE_PIPELINE_JOB_BUILD_ID = 644491924
model.save(force_insert=True)
get_or_create 的用法讲解
peewee 也提供了 get_or_create 函数: https://docs.peewee-orm.com/en/latest/peewee/api.html#Model.get_or_create
当 数据库存在时, 获取 model 并返回(不会更新数据), 当数据库不存在时, 创建数据(并且可以给其他字段同时赋值)
(先置空数据库)
效果如下:
第1次执行时的代码 (注意 JOB_STATUS 的值 是 001)
if __name__ == '__main__':
other_filed_and_values = {
'JOB_STATUS': '第 001 次执行'
}
model, is_new = AgileJobModel.get_or_create(
AGILE_PIPELINE_JOB_BUILD_ID=644491924,
defaults=other_filed_and_values
)
print('is new? ', is_new)
print(model.__data__)
第1次 执行的返回:
第2次执行时的代码 (注意 JOB_STATUS 的值 是 002)
if __name__ == '__main__':
other_filed_and_values = {
'JOB_STATUS': '第 002 次执行'
}
model, is_new = AgileJobModel.get_or_create(
AGILE_PIPELINE_JOB_BUILD_ID=644491924,
defaults=other_filed_and_values
)
print('is new? ', is_new)
print(model.__data__)
第二次 执行的返回:
注意:
第一次执行后, 往数据库插入了一条数据, 并且 model的返回, 只有部分字段
第二次执行后, 并没有更新数据库; 而model 的返回, 是数据库的所有字段,因为它实际上执行了 查询操作