时间字段精度问题
在使用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'))
网友评论