peewee爬坑

peewee update_time字段爬坑

SQLalchemy中BaseModel定義:mysql

# -*- 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定義:sql

# -*- 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'

在視圖函數更新數據:app

# 更新
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...異步

相關文章
相關標籤/搜索