资讯专栏INFORMATION COLUMN

peewee爬坑

jimhs / 339人阅读

摘要:代码示例用户基本信息用户名在视图函数更新数据更新只有调用字段的值才会在改变项目使用的,使用了语法数据库迁移管理,文档,文档

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...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42538.html

相关文章

  • peewee爬坑

    摘要:代码示例用户基本信息用户名在视图函数更新数据更新只有调用字段的值才会在改变项目使用的,使用了语法数据库迁移管理,文档,文档 peewee update_time字段爬坑 SQLalchemy中BaseModel定义: # -*- coding:utf-8 -*- from datetime import datetime from sqlalchemy import Column, D...

    ashe 评论0 收藏0
  • peewee爬坑

    摘要:代码示例用户基本信息用户名在视图函数更新数据更新只有调用字段的值才会在改变项目使用的,使用了语法数据库迁移管理,文档,文档 peewee update_time字段爬坑 SQLalchemy中BaseModel定义: # -*- coding:utf-8 -*- from datetime import datetime from sqlalchemy import Column, D...

    Java3y 评论0 收藏0
  • ORM-像对象一样对待数据

    摘要:顾名思义,就是将关系型数据库与中的对象关联起来,提供了一种操作数据的简便方式,相当于对数据库加了一层更友好的接口。新增数据对象方法方法直接创建数据对象,需要调用方法保存到数据库中。 咱们编程教室有不少同学,学完了基础课程,掌握了一定的编程能力,开始做项目了。然后很可能遇到一个问题:管理数据。课程里有讲过用文件保存数据,还有 pickle 、 csv 等模块辅助。但对于稍微复杂一点的数据...

    U2FsdGVkX1x 评论0 收藏0
  • 使用 Python 的 SQLite JSON1 和 FTS5 扩展

    摘要:每个对象包括一个标题,一个和顶层的元数据键,下面是提取作品标题的代码对应下面创建的查询在接下来的例子中,将提取包含特定标签的条目。对于扩展,该可选字典提供了附加元数据进行标记字段,以及通过前缀的长度存储快速前缀查询。 早在九月份,编程界出现一个名为 json1.c 的文件,此前这个文件一直在 SQLite 的库里面。还有,笔者也曾总结通过使用新的 json1 扩展来编译 pysqli...

    Lorry_Lu 评论0 收藏0

发表评论

0条评论

jimhs

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<