python - 如何使用mysql在数据库端声明默认高精度日期时间default + onupdate

标签 python mysql datetime sqlalchemy

我试图声明 create_timeupdate_time MySQL 数据库中具有高精度(毫秒/微秒精度)。问题是我找不到正确的语法/函数来运行这两个要求。

到目前为止的假设/挖掘:

  1. 我找到了MySQL使用mysql方言实现高精度日期时间的唯一方法 DATETIME(fsp=6) (或TIMESTAMP(fsp=6))
  2. 我需要使用参数 server_default为数据库设置默认值
  3. 我不知道如何设置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/

相关文章:

python - tornado 框架的 context_processor

c# - 使用两个读取器,一个嵌套在另一个内部

c# - Asp.Net WebApi 模型绑定(bind)可为空的日期时间

C# 日期时间堆栈内存

python - Plotly:如何在 Excel 中嵌入完全交互式的 Plotly 图形?

python - 如何点击 pygame 窗口中的特定位置?

python - celery 在任何更改时自动重新加载

mysql - codeigniter链查询关键字问题

php - 使用 create 方法从 laravel 获取最后插入的 id

c# - Windows 时间戳格式(MOUSEMOVEPOINT 返回值的类型)