美文网首页
SQLAlchemy Datetime时间字段如何定义精度到毫秒

SQLAlchemy Datetime时间字段如何定义精度到毫秒

作者: 越大大雨天 | 来源:发表于2020-04-29 15:00 被阅读0次

时间字段精度问题

在使用SQLALchemy作数据库操作时,遇到一个关于时间字段的问题。

我需要将一个时间格式精确到毫秒的数据保存到MySQL数据库,例如2020-05-01 9:10:30.543210这样的原始数据,但当我定义 Datetime字段后,保存进数据库的数据会被自动四舍五入到秒,比如2020-05-01 9:10:30.543210就变成了2020-05-01 9:10:31,这不是我想要的结果。

我的原始定义是这样的:

from sqlalchemy imoprt Metadata, Datetime


metadata = Metadata()

my_table = Table("my_table", metadata,
                 Column("create_dt", Datetime()))

我尝试像原生mysql定义数据表时那样,使用Datetime(6)的方式来定义Columns,但依然不行,查看Datetime源码后发现它也只接收一个时区参数,并没有精度参数。

解决办法

查找一番后发现如果需要时间精度,应该使用另一个SQLAlchemy的时间类来实现,即:sqlalchemy.dialects.mysql.DATETIME类, 该类不仅接收时区参数,还可以接收一个时间精度参数fsp:

from sqlalchemy imoprt Metadata
from sqlalchemy.dialects.mysql import DATETIME


metadata = Metadata()

my_table = Table("my_table", metadata,
                 Column("create_dt", DATETIME(fsp=6)))

这样定义时间字段后,将能保存时间精度到毫秒,插入数据后查看,发现保存的字段内容已经变成了2020-05-01 9:10:30.543210

开心解决!

另外

同样,如果使用Timstamp类型的时间字段需要保留时间精度,也只能导入sqlalchemy.dialects.mysql.TIMESTAMP类, 而不能使用sqlalchemy.TIMESTAMP!

在此另记录一下,若TIMESTAMP类型字段要设置默认时间和默认更新时间,需要使用text('CURRENT_TIMESTAMP')的方式定义, 若想同时使用自动更新,可使用text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')方式:

from sqlalchemy import Column, TIMESTAMP, text
status = Table("status", metadata,
               Column("update_time", TIMESTAMP(), 
                      server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))

相关文章

网友评论

      本文标题:SQLAlchemy Datetime时间字段如何定义精度到毫秒

      本文链接:https://www.haomeiwen.com/subject/rhngwhtx.html