如何自动填充 SQLAlchemy 数据库字段? (Flask-SQLAlchemy)

Posted

技术标签:

【中文标题】如何自动填充 SQLAlchemy 数据库字段? (Flask-SQLAlchemy)【英文标题】:How Can I Automatically Populate SQLAlchemy Database Fields? (Flask-SQLAlchemy) 【发布时间】:2012-08-22 15:47:46 【问题描述】:

我有一个简单的用户模型,定义如下:

# models.py
from datetime import datetime
from myapp import db

class User(db.Model):
  id = db.Column(db.Integer(), primary_key=True)
  email = db.Column(db.String(100), unique=True)
  password = db.Column(db.String(100))
  date_updated = db.Column(db.DateTime())

  def __init__(self, email, password, date_updated=None):
    self.email = email
    self.password = password
    self.date_updated = datetime.utcnow()

当我创建一个新的用户对象时,我的date_updated 字段被设置为当前时间。我想做的是让每当我将更改保存到我的用户对象时,我的date_updated 字段会自动设置为当前时间。

我已经浏览了文档,但在我的一生中,我似乎找不到任何对此的参考。我对 SQLAlchemy 很陌生,所以我真的没有任何经验可以借鉴。

希望得到一些反馈,谢谢。

【问题讨论】:

此类字段通常称为审计或记录时间戳字段。使用这些术语进行搜索可能会发现更多信息。 【参考方案1】:

只需将server_defaultdefault 参数添加到列字段:

created_on = db.Column(db.DateTime, server_default=db.func.now())
updated_on = db.Column(db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now())

我更喜欢created,updated_on 列名。 ;)

关于 column insert/update defaults 的 SQLAlchemy 文档。

[编辑]:更新代码以在代码中使用server_default 参数。

[编辑 2]:onupdate 替换为 server_onupdate 参数。

【讨论】:

您好,请您告知如何修改时区,因为db.func.now() 将时间戳返回到我的时区之外。提前致谢。 我发现只是updated_on = db.Column(db.DateTime, onupdate=datetime.datetime.now)根据this解决时区问题。 为什么使用server_default?文档罗嗦但没用。从名称猜测它出现在数据库中? server_default 是在create_table 指令期间在SQL 中发出的服务器端值,而default 值是指模型的python 端。如alembic.zzzcomputing.com/en/latest/ops.html * 特别是,要在数据库端创建的默认值是使用server_default 参数指定的,而不是default,它只指定Python 端的默认值* 不要在 mysql 5.5 上工作,因为它不支持 DATETIME DEFAULT now() 。还有什么办法吗?【参考方案2】:
date_created  = db.Column(db.DateTime,  default=db.func.current_timestamp())
date_modified = db.Column(db.DateTime,  default=db.func.current_timestamp(),
                                       onupdate=db.func.current_timestamp())

【讨论】:

这个变种的一些理由,在这里找到:groups.google.com/forum/#!topic/sqlalchemy/7A6LCOKnrVY

以上是关于如何自动填充 SQLAlchemy 数据库字段? (Flask-SQLAlchemy)的主要内容,如果未能解决你的问题,请参考以下文章

SqlAlchemy 将新字段添加到类并在表中创建相应的列

使用来自 SQLAlchemy 对象的数据在烧瓶中预填充 WTforms

如何设计Sql数据库中的字段为自动填充数据并自动加1的自增量

MybatisPlus 多数据源自动建表、级联查询、自动填充.......

如何在html表单中自动填充输入字段

如何将自动过滤器添加到与 SQLAlchemy 的关系中?