SQLAlchemy Datetime 和 TIMESTAMP

sqlalchemyDatetime的创建时间-修改时间之default|server_default|onupdate 阅读详情

SQLAlchemy 是 python 中常用都ORM的组建,在Flask 中广泛使用。

default 和server_default :

default = 默认值只在使用SQLAlchemy创建数据时候才生效, 如果想要在任何地方都生效需要使用 server_default

二者联系和区别

在官方手册里可以看到,对二者是支持的,在Datatime 'YYYY-MM-DD hh:mm:ss' 格式下 与 TIMESTAMP的格式 '2038-01-19 03:14:07' UTC是等效的

不同之处是:

Datatime 范围是   The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.

TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.

范围不同,书写格式不同UTC。

Datetime 的server_default 一般使用使用func.utime(), 求一次时间的结果

TIMESTAMP 的server_default 一般使用text("CURRENT_TIMESTAMP"), 从系统中获得 CURRENT_TIMESTAMP 是个时间变量

 

在这里我们创建2个表,验证Datetime 和TIMESTAMP 两种格式的时间

class TestData1(db.Model):
    __tablename__ = 'test1'


    id= db.Column(db.INTEGER,primary_key=True,autoincrement=True)
    name=db.Column(db.String(64),default="hello")
    ctime0 = db.Column(db.DateTime)
    ctime1 = db.Column(db.DateTime,nullable=False)
    ctime2 = db.Column(db.DateTime,nullable=False, default=datetime.utcnow())
    ctime3 = db.Column(db.DateTime,nullable=False, server_default=func.now())
    ctime4 = db.Column(db.DateTime,nullable=False, server_default=func.now(),server_onupdate=func.now())
    ctime5 = db.Column(db.DateTime,nullable=False, server_default=func.now())
    ctime6 = db.Column(db.DateTime,nullable=False, server_default=func.now(), onupdate=func.now())


class TestData2(db.Model):
    __tablename__ = 'test2'


    id = db.Column(db.INTEGER, primary_key=True, autoincrement=True)
    name = db.Column(db.String(64), default="hello")
    utime0 = db.Column(db.TIMESTAMP)
    utime1 = db.Column(db.TIMESTAMP,nullable=False)
    utime2 = db.Column(db.TIMESTAMP(True))
    utime3 = db.Column(db.TIMESTAMP(True),nullable=False)
    utime4 = db.Column(db.TIMESTAMP(True),nullable=False,default=db.text('CURRENT_TIMESTAMP'))
    utime5 = db.Column(db.TIMESTAMP(True),nullable=False,server_default=db.text('CURRENT_TIMESTAMP'))
    utime6 = db.Column(db.TIMESTAMP(True),nullable=False,default=db.text('CURRENT_TIMESTAMP'),server_default=db.text('CURRENT_TIMESTAMP'))
    utime7 = db.Column(db.TIMESTAMP(True),nullable=False,server_default=db.text('CURRENT_TIMESTAMP'),onupdate=db.text('CURRENT_TIMESTAMP'))
    utime8 = db.Column(db.TIMESTAMP(True),nullable=False,default=db.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

然后我们生成表,使用flask shell 来测试。

通过 sqlalchemy 来更新数据

>>> read_td1()
ctime0 = 2021-02-04 03:14:31
ctime1 = 2021-02-04 03:14:29
ctime2 = 2021-02-04 03:14:50
ctime3 = 2021-02-04 11:14:37
ctime4 = 2021-02-04 11:14:37
ctime5 = 2021-02-04 11:14:37
ctime6 = 2021-02-04 11:14:37
>>> D1 = TestData1.query.filter_by(id=1).first()
>>> D1.name
'200'
>>> D1.name="201"
>>> db.session.commit()
>>> read_td1()
ctime0 = 2021-02-04 03:14:31
ctime1 = 2021-02-04 03:14:29
ctime2 = 2021-02-04 03:14:50
ctime3 = 2021-02-04 11:14:37
ctime4 = 2021-02-04 11:14:37
ctime5 = 2021-02-04 11:14:37
ctime6 = 2021-02-04 11:26:22
>>>

手动更新数据,即直接操作DB

>>> read_td1()
ctime0 = 2021-02-04 03:14:31
ctime1 = 2021-02-04 03:14:29
ctime2 = 2021-02-04 03:14:50
ctime3 = 2021-02-04 11:14:37
ctime4 = 2021-02-04 11:14:37
ctime5 = 2021-02-04 11:14:37
ctime6 = 2021-02-04 11:26:22
>>> from sap.models import db,TestData1,TestData2
KeyboardInterrupt
>>> D1 = TestData1.query.filter_by(id=1).first()
>>> D1.name
'208'

 

通过sqlalchemy 来更新test2 表

>>> print(*["{} = {}".format(key,getattr(D2,key)) for key in  map(lambda x:"utime{}".format(x),range(9))],sep="\n")
utime0 = None
utime1 = 2021-02-04 03:36:46
utime2 = None
utime3 = 2021-02-04 03:36:57
utime4 = 2021-02-04 03:37:01
utime5 = 2021-02-04 11:37:09
utime6 = 2021-02-04 11:37:09
utime7 = 2021-02-04 11:37:09
utime8 = 2021-02-04 03:37:07
>>> D2.name="gg"
>>> db.session.commit()
>>> D2= TestData2.query.filter_by(id=1).first()
>>> D2.name
'gg'
>>> print(*["{} = {}".format(key,getattr(D2,key)) for key in  map(lambda x:"utime{}".format(x),range(9))],sep="\n")
utime0 = None
utime1 = 2021-02-04 03:36:46
utime2 = None
utime3 = 2021-02-04 03:36:57
utime4 = 2021-02-04 03:37:01
utime5 = 2021-02-04 11:37:09
utime6 = 2021-02-04 11:37:09
utime7 = 2021-02-04 11:39:55
utime8 = 2021-02-04 03:37:07
>>>

手动操作数据库

mysql> update test2 set name="baba" where id=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql> select * from test2\G;
*************************** 1. row ***************************
    id: 1
  name: baba
utime0: NULL
utime1: 2021-02-04 03:36:46
utime2: NULL
utime3: 2021-02-04 03:36:57
utime4: 2021-02-04 03:37:01
utime5: 2021-02-04 11:37:09
utime6: 2021-02-04 11:37:09
utime7: 2021-02-04 11:39:55
utime8: 2021-02-04 03:37:07
1 row in set (0.00 sec)



>>> D2= TestData2.query.filter_by(id=1).first()
>>> D2.name
'baba'
>>> print(*["{} = {}".format(key,getattr(D2,key)) for key in  map(lambda x:"utime{}".format(x),range(9))],sep="\n")
utime0 = None
utime1 = 2021-02-04 03:36:46
utime2 = None
utime3 = 2021-02-04 03:36:57
utime4 = 2021-02-04 03:37:01
utime5 = 2021-02-04 11:37:09
utime6 = 2021-02-04 11:37:09
utime7 = 2021-02-04 11:39:55
utime8 = 2021-02-04 03:37:07
>>>

 

 

通过sqlalchemy 使用 时候,models 中可以使用这2种格式 创建自动更新时间的字段:
  ctime6 = db.Column(db.DateTime,nullable=False, server_default=func.now(), onupdate=func.now())

或者

    utime7 = db.Column(db.TIMESTAMP(True),nullable=False,server_default=db.text('CURRENT_TIMESTAMP'),onupdate=db.text('CURRENT_TIMESTAMP'))

能做到自动更新时间。

 

 

 

 

sqlmodel怎么定义时间类型 如果你想要自动设置这些时间字段,比如在创建或更新记录时自动设置当前时间,你可以在模型中使用 Python 的。SQLModel 扩展了 SQLAlchemy 的功能,允许你以类型注解的方式定义模型。类型,因此你可以直接使用 SQLAlchemy 的所有相关功能。SQLModel 允许你在模型中直接使用 Python 的。当你创建模型的实例并设置这些字段时,你可以传递一个。用于获取当前的 UTC 时间,你可以根据需要使用。在 SQLModel 中定义时间类型,你可以使用。请注意,SQLModel 的。 阅读详情

相关推荐

sqlalchemy Column中defaultserver_default的区别

源码 app.py from flask import Flask from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy from sqlalchemy import text class Config: SQLALCHEMY_DATABASE_URI = 'sqlite:///test.db' app = Flask(__name__) app.config.from_object(Config)

llc的博客 3189

SQLAlchemy DateTime

我们使用datetime.now()函数来获取当前的日期时间,并将其作为新用户的注册时间。当你使用DateTime类型时,SQLAlchemy会将其映射到数据库中的相应日期时间类型。你可以使用Pythondatetime模块来处理日期时间数据,并将其与SQLAlchemy模型一起使用。当你需要存储一个特定的时间点,比如用户的注册时间、文章的发布时间等,DateTime类型是一个很好的选择。因此,在使用DateTime类型时,请确保你了解你的数据库系统如何处理日期时间数据,并相应地调整你的模型定义。

Flask Web 706

Flask数据库操作实战:从SQLAlchemy ORM到原生SQL的完整指南

本文详细介绍了Flask框架中数据库操作的两种主要方式:SQLAlchemy ORM原生SQL。通过实战示例,展示了从基础配置到高级查询技巧的全过程,包括模型定义、CRUD操作、性能优化以及混合使用ORM与原生SQL的最佳实践,帮助开发者根据项目需求灵活选择数据库操作方案。

weixin_33901641的博客 332

SQLAlchemy打印原生SQL

【代码】SQLAlchemy打印原生SQL。

Good Luck 6910

解决在使用sqlalchemy映射更新mysql时出现的datetime设置的问题

db.Column(db.DateTime,default=datetime.now()) 在migrate时总是报类似的错误 AttributeError: module 'datetime' has no attribute 'now'; 百度说是mysql版本升级了,在5.6以上均存在datetime的问题,应该设置为timestamp,试了几次也是错误。 经多次尝试得知真相: 其中...

helixsky的博客 5186

Flask时间戳笔记

created_time =db.Column(db.DateTime, default=datetime.now) updated_time =db.Column(db.DateTime, default=datetime.now,onupdate=datetime.now) timestamp字段使用的是datetime.now而不是datetime.now()。 datetime.now...

峥嵘之舟 2545

sqlalchemy Table中Column(BigInteger, default=int(time.time()))每次保存的值都是一样的

但当我们在插入数据时,不手动设置create_time字段而是通过默认值设置,发现每一次设置的值都是相同的。这样的写法会导致sqlalchemy将初始化时生成的int(time.time())的结果当作一个。正确的写法应该是传入生成默认值的函数到default中。当我们需要记录数据的插入时间的时候常用到这样的保存方法。如果是使用时间格式,而不是时间戳的话。保存下来,作为default的值。

Sablier的博客 426

SQL中datetimetimestamp的区别

在开发一个简单的报名程序时,要求在每一条新插入的记录后面添加一个日期字段,方便日后查询排序。于是立即百度,发现可以使用datetimetimestamp两种日期类型来实现。这对于爱纠结的我来说是不被允许的,于是立即去找它们的区别。但是搜出来的要么是长篇大论,要么没有重点,于是自己总结了下这些文章的精华部分,以求精益求精。 datetime 1、允许为空值,可以...

aao41053的博客 903

SQLAlchemy】第3节:常用的字段及其约束

SQLAlchemy】第3节:常用的字段及其约束1 导包2 常用的字段类型3 常用约束4 例子 1 导包 from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,SmallInteger,Bi...

kzl_knight的博客 1万+

sqlalchemy查询时过滤类型为TIMESTAMP字段的数据

1、问题记录:python中,如何得到过滤字段为TIMESTAMP类型的数据库表中的数据?(过滤create_time为当天的数据) python中简化的表的结构如下: class Test(Base): __tablename__ = 'test' create_time = Column(TIMESTAMP, nullable=False, server_default=text("CURRENT_TIMESTAMP")) id = Column(Inter) create_time的数据类

请叫我皮皮虾的博客 1052

sqlalchemy mysql python 解决方案及相关问题

三种sqlalchemy连接方式 pip install pymysql 对应 "mysql+pymysql://...." pip install mysqlclient对应"mysql+mysqldb://...." pip install mysql-connector对应"mysql+mysqlconnector://...." 时间戳TimeStamp问题,直接使用sqlalchemy 中的TIMESTAMP作为Column类型参数,当上传会话时会报错类似'Times...

GlaDOS.AI的博客 1168

sqlalchemy 在数据库端设置字段的默认值

我们通过sqlalchemy定义模型创建的数据库表,通常会通过ORM的方式操作,但在开发的过程中难免也会遇到不通过ORM而直接操作数据库的情况。这时我们在定义模型时,给字段设置的默认值就不能安装以前的方法了,这里有些坑我先踩过了,在此记录一下已便他人查阅。 比如我们现在想创建一张user表,根据需求几个字段的默认值设置如下: is_vip字段设置默认值为0 create_time字段默认值设...

平头哥(Adger)的博客 4827

sqlalchemy实现时间列自动更新

一、使用场景需求 1、在实际项目开发过程中,用户可以操作的数据,我们往往会新增一个字段,来保存用户最后一次修改时间 2、一些系统中,我们需要存储用户最后一次登录时间,来统计用户的活跃度 二、 在sqlalchemy中常规的做法 1、数据模型 import datetime from uuid import uuid4 from sqlalchemy import Column, Integ...

水痕 1万+

python Alchemy filter中datetime类型变量比较

python Alchemy filter中datetime类型变量比较,不能将datetime变为str再比较,否则条件无效

yuxuan89814的专栏 516

mysql时间字段精度_SQLAlchemy Datetime时间字段如何定义精度到毫秒?

时间字段精度问题在使用SQLALchemy作数据库操作时,遇到一个关于时间字段的问题。我需要将一个时间格式精确到毫秒的数据保存到MySQL数据库,例如2020-05-01 9:10:30.543210这样的原始数据,但当我定义 Datetime字段后,保存进数据库的数据会被自动四舍五入到秒,比如2020-05-01 9:10:30.543210就变成了2020-05-01 9:10:31,这不是我...

weixin_29455479的博客 1185

sqlalchemy 设置 TIMESTAMP 类型的字段自动更新时间

from sqlalchemy import Column, TIMESTAMP, text ts = Column(TIMESTAMP, server_default=text('CURRENT_TIMESTAMP'), server_onupdate=text('CURRENT_TIMESTAMP'))

远哥的小迷弟 5332

SQLAlchemy-mixins实战:3分钟实现模型自动时间戳与优雅序列化

```bash git clone https://gitcode.com/gh_mirrors/sq/sqlalchemy-mixins ``` 3. **查看完整示例**: 探索[examples/](https://link.gitcode.com/i/5138f77a8801d412450c87c6f2b1ce60)目录下的演示文件,包含所有混合类的使用方法。 ## 💡 最佳实践

gitblog_00431的博客 886

PugSQL与SQLAlchemy集成:打造强大的Python数据库开发栈

PugSQL是一个受HugSQL启发的Python数据库库,它提供了一种简单的方式来使用参数化SQL文件,并且能够与任何SQLAlchemy支持的数据库无缝集成。这种组合为Python开发者带来了强大而灵活的数据库开发体验,既保留了SQL的原始表达能力,又获得了SQLAlchemy的强大功能支持。 ## 为什么选择PugSQL与SQLAlchemy集成? PugSQL与SQLAlchemy的集

gitblog_00488的博客 1059
上一篇: python context 上下文 总结
下一篇: 生日前夕做了个梦,向30岁问个好
pls2333
博客等级 码龄10年 3粉丝 36原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值