SQLAlchemy Datetime 和 TIMESTAMP

sqlalchemy Column中default和server_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) 阅读详情
AI摘要

本文介绍了SQLAlchemy在Python中的使用,特别是默认值default和server_default的区别。讨论了Datatime和TIMESTAMP的范围和格式差异,并展示了如何设置自动更新的时间字段。通过创建表和实际操作,演示了如何利用func.now()和CURRENT_TIMESTAMP来设定初始和更新时间。

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'))

能做到自动更新时间。

 

 

 

 

sqlalchemy时间范围查询 使用和运算符可以定义一个开区间,即不包含边界值。between方法用于定义闭区间,即包括边界值。根据你的需求,选择合适的方法来进行时间范围查询。 阅读详情

相关推荐

Python 爬虫实战:使用 ORM 框架(SQLAlchemy)管理爬虫数据

本文以知乎热榜爬虫为例,详细介绍了使用SQLAlchemy ORM框架进行爬虫数据管理的完整流程。通过定义数据模型类映射数据库表结构,实现了面向对象的数据库操作方式。重点讲解了数据的增删改查、事务管理、批量操作等核心功能,并对比了ORM与原生SQL的性能差异。文章还提供了查询优化、索引配置等高级技巧,帮助开发者提升数据存储效率。案例展示了如何通过ORM框架简化爬虫数据管理,同时保证数据一致性和系统可维护性,为爬虫开发者提供了实用的ORM应用指南。

2503_91057718的博客 1059

SQLAlchemy DateTime

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

Flask Web 714

维护测试监控LLM应用

LangFuse: 开源 + SaaS(免费/付费),LangSmith 平替,可集成 LangChain 也可直接对接 OpenAI API;LangSmith: LangChain 的官方平台,SaaS 服务(免费/付费),非开源,企业版支持私有部署;调试 Prompt 的 Playground测试/验证系统的相关指标数据集管理各种指标监控与统计:访问量、响应时长、Token 费等等。

SunnyRivers 1782

SQLAlchemy打印原生SQL

【代码】SQLAlchemy打印原生SQL。

Good Luck 6912

VS Code + ESP-IDF:离线环境配置与示例工程编译全指南

本文详细介绍了在VS Code中离线配置ESP-IDF开发环境的完整流程。针对国内开发者常遇到的网络问题,指南提供了从Python环境准备、获取离线安装包、运行安装器到VS Code插件配置与示例工程编译的全套解决方案,确保环境搭建稳定、可控且高效。

weixin_28842367的博客 403

python+playwright 学习-10.pytest-playwright插件编写测试用例

pytest-playwright插件完美的继承了pytest 用例框架和playwright基础使用的封装,基本能满足工作中的常规需求了,不需要我们再做额外的插件开发。

qq_27371025的博客 2519

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

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

helixsky的博客 5191

20、微电网系统的系统框架、建模与控制架构解析

本文详细解析了微电网系统的系统框架、建模方法以及控制架构。文章首先介绍了在系统的系统(SoS)框架下,微电网如何通过微控制器(MC)和微电网中央控制器(MGCC)协调运行,并支持并网与孤岛模式下的高效能量管理。随后,针对微电网的关键组件,包括微涡轮机、光伏太阳能电池和风力涡轮机,提供了详细的数学建模分析。最后,探讨了微电网的控制架构设计,涵盖分层控制和共识控制策略,以实现系统的高效、稳定运行,满足日益增长的能源需求与市场要求。

elastic6hunter的博客 206

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

峥嵘之舟 2547

修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

【代码】修复漏洞Windows 2012 Server R2(CVE-2016-2183)、(CVE-2015-2808)、(CVE-2013-2566)

路~可以走过 2773

rk3588平台USB 3.0 -OAK深度相机适配方法

摘要:本文记录了OAK摄像头设备的配置与测试流程。主要内容包括:1)添加USB设备udev规则;2)拉取相关依赖库;3)安装Python3和pip;4)安装项目依赖;5)安装FFmpeg工具;6)测试摄像头功能并转换视频格式;7)将测试视频拷贝到U盘查看。操作步骤涵盖了从设备驱动配置到功能测试的完整流程,提供了详细的命令行操作指引。通过该文档可快速完成OAK摄像头的环境搭建和基础功能验证。

yy_hear的博客 325

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

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

Sablier的博客 430

cefsharp139-H264-X86升级测试(MP4)-支持PDF预览-chromium7258定制浏览器

CEFSharp 139.x版本升级测试已完成,该版本支持64位系统(需选择x86架构)及WinForms.NETCore(.NET8)。升级内容包括H264文件编译支持Mp4播放,并覆盖WPF、WinForms等平台。文中提供了版本替换方法及不同系统的版本建议(如Win10/11推荐111/133/134/139版)。此外,文章还列举了CEFSharp的多种应用场景,包括浏览器开发、B/S系统封装、资源抓取等,同时指出当前版本均需自行编译以支持MP4播放。详细图文说明及旧版链接已附在正文中。

无线智能模块 可视DIY智能专家 1299

SQL中datetime和timestamp的区别

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

aao41053的博客 905

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【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万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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的数据类

请叫我皮皮虾的博客 1057

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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的博客 1173

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

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

平头哥(Adger)的博客 4835

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的专栏 518

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的博客 1191

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

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

远哥的小迷弟 5337

SQLAlchemy SQLite 方言完全指南:驱动、类型、Upsert、事务与并发

本文围绕 SQLAlchemy 官方文档 [doc/build/dialects/sqlite.rst](https://link.gitcode.com/i/21796a48ac2d441d428356f24aa7c882) 展开,系统讲解 SQLAlchemy 对 SQLite 的内建支持:包括 pysqlite(sqlite3)、aiosqlite、pysqlcipher 三类驱动的连接方式

gitblog_00390的博客 793

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

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

gitblog_00431的博客 892

TDengine 与 Pandas 集成指南:基于 SQLAlchemy 实现数据读写与分析

Pandas 是 Python 生态中最流行的数据处理与分析库,通过 TDengine 官方 Python 连接器(taospy)与 SQLAlchemy 的组合,Pandas 可以无缝对接 TDengine 时间序列数据库,直接读写 TDengine 中的结构化数据并完成数据展示与分析。本指南以当前仓库中的官方文档与示例代码为基础,完整介绍环境准备、数据源配置、数据类型映射,以及使用 `to_s

gitblog_00608的博客 1000
上一篇: python context 上下文 总结
下一篇: 生日前夕做了个梦,向30岁问个好
pls2333
博客等级 码龄11年 3粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值