我试图声明 create_time
和 update_time
MySQL 数据库中具有高精度(毫秒/微秒精度)。问题是我找不到正确的语法/函数来运行这两个要求。
到目前为止的假设/挖掘:
- 我找到了MySQL使用mysql方言实现高精度日期时间的唯一方法
DATETIME(fsp=6)
(或TIMESTAMP(fsp=6)
) - 我需要使用参数
server_default
为数据库设置默认值 - 我不知道如何设置
ON UPDATE NOW(6)
这是我正在设置的表格的精简版本:
from datetime import datetime
from sqlalchemy.dialects.mysql import DATETIME
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func
def create_declarative_base():
base = declarative_base()
base.__table_args__ = {
'mysql_engine': 'InnoDB',
'mysql_charset': 'utf8',
}
return base
Base = create_declarative_base()
class CreateUpdateTable(Base):
__tablename__ = 'create_update_table'
create_time = Column(DATETIME(fsp=6), server_default=func.now(), nullable=False)
update_time = Column(DATETIME(fsp=6), server_default=func.now(), onupdate=datetime.utcnow, nullable=False)
运行此命令时,我得到 Invalid default value for 'create_time'
作为 func.now()
序列化为create_time DATETIME(6) NOT NULL DEFAULT now()
但它需要是 ...now(6)
我也尝试过做一个简单的 server_default='NOW(6)'
但这意味着 create_time TIMESTAMP(6) NOT NULL DEFAULT 'now(6)'
(其中表达式是一个字符串...)
最佳答案
感谢一位同事提出的建议,也@Terminus暗示过,我对这两个问题都有一个很好的解决方案:
from datetime import datetime
from sqlalchemy import text
from sqlalchemy.dialects.mysql import DATETIME
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func
def create_declarative_base():
base = declarative_base()
base.__table_args__ = {
'mysql_engine': 'InnoDB',
'mysql_charset': 'utf8',
}
return base
Base = create_declarative_base()
class CreateUpdateTable(Base):
__tablename__ = 'create_update_table'
create_time = Column(DATETIME(fsp=6), server_default=text('CURRENT_TIMESTAMP(6)'), nullable=False)
update_time = Column(DATETIME(fsp=6), server_default=text('CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)'), nullable=False)
关于python - 如何使用mysql在数据库端声明默认高精度日期时间default + onupdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458722/