如何自动填充 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_default
或default
参数添加到列字段:
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 对象的数据在烧瓶中预填充 WTforms
如何设计Sql数据库中的字段为自动填充数据并自动加1的自增量