gpt4 book ai didi

python - SqlAlchemy mysql 毫秒或微秒精度

转载 作者:可可西里 更新时间:2023-11-01 07:10:20 26 4
gpt4 key购买 nike

我一直在冒险尝试让分数时间分辨率在我的数据库中正常工作。我使用 python 方法 datetime.now() 来创建日期对象。然后,我将这些对象存储在一个映射到 COLUMN(DATETIME(9)) 的字段中,该字段来自 SqlAlchemy 的库。最初,我收到一条错误消息,指出我的数据被截断了。这是因为我使用的是 mysql 5.5。我已经更新到 5.6.19,不再收到数据截断错误。

但是,数据库实际上仍然不包含小数时间条目。例如,这是实例化 datetime.now() 对象时的值:

2015-04-17 16:31:12.804444

以上正是我所期望的。内存中的对象具有微秒分辨率。现在,将其保存到 mysql 数据库后,如果我打开 mysql 命令行客户端并使用 select 语句返回行,我会看到以下值:

2015-04-17 16:31:13

显然,该值四舍五入到最接近的秒数。这很糟糕,我不知道是什么原因造成的!

如果相关,我使用的是 mysql-connector-python==2.0.3

更新:我也尝试使用 COLUMN(DATETIME(6)),但得到了相同的行为。

我在下面包括模型,以防信息相关:

class User(Base):
__tablename__ = 'Users'

uid = Column(INT, primary_key=True, autoincrement=True)
dateCreated = Column(DATETIME(6))

def __init__(self, *args, **kwargs):
super(user, self).__init__(*args, **kwargs)
self.dateCreated = datetime.now()

更新:佩德罗的建议不是问题,尽管它确实帮助我取得了进步,非常感谢。我尝试逐步执行 sql 连接器中的代码,直到到达 mysql 插入语句。该语句确实包含小数时间值。但是,在执行时,该值会四舍五入。当我在表上进行描述时,我注意到日期时间类型只是 datetime 而它实际上应该是 datetime(6)

我正在使用 SA 模型生成数据库本身,该模型显式声明了 Column(DATETIME(6))Base.metadata.create_all(self.db, checkfirst=True ) ,所以我不明白为什么 (6) 没有出现在实际的表结构中。我想我很快就会弄清楚,我会在弄清楚时发布更新。

更新:DATETIME 的构造函数不接受字段长度规范。它只需要时区参数。我不清楚如何指定日期时间字段的长度,因为对于像 varchar 这样的类型,只需将其传递给构造函数即可。潜水继续。

最佳答案

我遇到的问题是,普通的 SqlAlchemy DATETIME 类不能满足 mysql 将 (6) 值传递到构造函数以表示小数时间值的要求。相反,需要使用 sqlalchemy.dialects.mysql.DATETIME 类。此类允许使用 fsp 参数(小数秒参数。)因此,列声明实际上应该如下所示:

dateCreated = Column(DATETIME(fsp=6)) 

感谢其他回复的人。它帮助指导我的调查,最终绊倒了这个深奥且非常困惑的区别。

关于python - SqlAlchemy mysql 毫秒或微秒精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29711102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com