peewee update_time字段爬坑
SQLalchemy中BaseModel定义:
# -*- coding:utf-8 -*-
from datetime import datetime
from sqlalchemy import Column, DateTime
class BaseModel(object):
"""模型基类,为每个模型补充创建时间与更新时间"""
create_time = Column(DateTime, default=datetime.now) # 记录的创建时间
update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now) # 记录的更新时间
peewee中的BaseModel定义:
# -*- coding: utf-8 -*-
from datetime import datetime
from peewee import Model, CharField
import peewee_async # peewee_async异步操作MySQL
from configs import config
# 数据库连接池
db = peewee_async.PooledMySQLDatabase(
config.get('mysql_db'), host=config.get('mysql_host'), port=config.get('mysql_port'),
user=config.get('user'), password=config.get('pwd'),
min_connections=10,
max_connections=50
)
class BaseModel(Model):
"""模型基类,为每个模型补充创建时间与更新时间"""
create_time = DateTimeField(default=datetime.now, verbose_name='创建时间') # 记录的创建时间
update_time = DateTimeField(default=datetime.now, verbose_name='更新时间') # 记录的更新时间
def save(self, *args, **kwargs):
"""覆写save方法, update_time字段自动更新, 实例对象需要在update成功之后调用save()"""
if self._get_pk_value() is None:
# this is a create operation, set the date_created field
self.create_time = datetime.now().strftime(
"%Y-%m-%d %H:%M:%S")
self.update_time = datetime.now().strftime(
"%Y-%m-%d %H:%M:%S")
return super(BaseModel, self).save(*args, **kwargs)
很明显sqlalchemy定义的update_time字段的onupdate=datetime.now会在模型类的实例对象更新的时候自动更新该字段的值;而peewee的update_time字段并没有onupdate这个选项,从而无法实现自动的更新时间,故而在BaseModel中覆写了save方法,其他模型类继承BaseModel,那么子类的实例对象在update成功之后调用对象的save方法可以达到更新update_time字段值的目的。
代码示例:
class User(BaseModel):
"""用户"""
# 1 基本信息
user_name= CharField(max_length=16, unique=True, null=False, verbose_name='用户名')
class Meta:
database = db
db_table = 'user'
在视图函数更新数据:
# 更新
try:
async with db.atomic_async():
user.user_name= new_user_name
await self.application.manager.update(user, only=['user_name'])
except Exception as err:
self.application.logger.error(err)
db.rollback()
else:
# update_time
user.save() # 只有调用save() update_time字段的值才会在MySQL改变
NOTE:项目使用的tornado5.1,使用了async+await语法;数据库迁移管理peewee-migrate,peewee文档:http://docs.peewee-orm.com/en…, peewee-async文档:https://peewee-async.readthed…