SqlAlchemy mysql 毫秒或微秒精度
回答问题 我一直在冒险尝试让分数时间分辨率在我的数据库中正常工作。我使用 python 方法datetime.now()来创建日期对象。然后我将这些对象存储在一个字段中,该字段映射到来自 SqlAlchemy 库的COLUMN(DATETIME(9))。最初,我收到一个错误,即我的数据被截断。这是因为我使用的是 mysql 5.5。我已经更新到 5.6.19 并且不再收到数据截断错误。 但是,数据
回答问题
我一直在冒险尝试让分数时间分辨率在我的数据库中正常工作。我使用 python 方法datetime.now()
来创建日期对象。然后我将这些对象存储在一个字段中,该字段映射到来自 SqlAlchemy 库的COLUMN(DATETIME(9))
。最初,我收到一个错误,即我的数据被截断。这是因为我使用的是 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-pythonu003du003d2.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 insert 语句。该语句确实包含小数时间值。但是,在执行时,该值是四舍五入的。当我在桌子上做了一个描述时,我注意到日期时间类型就是那个,datetime
,当它真的应该是datetime(6)
时。
我使用 SA 模型生成数据库本身,该模型明确声明了Column(DATETIME(6))
和Base.metadata.create_all(self.db, checkfirst=True)
,所以我不明白为什么 (6) 没有最终出现在实际的表结构中。我想我很快就会弄明白的,我会在我这样做的时候发布更新。
更新: DATETIME 的构造函数不接受字段长度规范。它只需要时区的参数。我不清楚如何指定日期时间字段的长度,因为对于像 varchar 这样的类型,只需将其传递给构造函数。潜水继续。
Answers
我遇到的问题是库存的 SqlAlchemy DATETIME 类不适用于将 (6) 值传递给构造函数以表示小数时间值的 mysql 要求。相反,需要使用sqlalchemy.dialects.mysql.DATETIME
类。此类允许使用fsp
参数(小数秒参数)。因此,列声明实际上应该如下所示:
dateCreated = Column(DATETIME(fsp=6))
感谢其他回复的人。它帮助指导我的调查最终绊倒了这个深奥且非常令人困惑的区别。
更多推荐
所有评论(0)