You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在SQLAlchemy中为MySQL表的datetime字段设置正确的服务器默认值?

如何在SQLAlchemy中为MySQL表的datetime字段设置正确的服务器默认值?

嘿,我完全懂你碰到的这个糟心事——用SQLAlchemy给MySQL表的created_at字段设置服务器默认值,结果数据库里的默认值变成了字符串(now()),插入数据时直接报错,试过func.now()func.current_timestamp()都没解决,对吧?我来帮你搞定这个问题。

问题根源

你遇到的情况大概率是SQLAlchemy和PyMySQL的组合在解析函数表达式时出了问题,把原本应该是MySQL函数调用的内容错误地转义成了字符串常量,导致MySQL无法识别(now())为合法的datetime值。

解决方案

1. 改用text()传入原生SQL函数

最直接的解决办法是用SQLAlchemy的text()方法直接传递原生MySQL的时间函数,这样SQLAlchemy会把它当作原生SQL片段处理,不会额外转义:

from db import db
from sqlalchemy import Column, DateTime, String, Integer, text

class BlogModel(db.Model):
    __tablename__ = "blogs"

    id = Column(Integer, primary_key=True)
    created_at = Column(DateTime(timezone=True), server_default=text('CURRENT_TIMESTAMP'), nullable=False)

如果你的MySQL版本支持(5.6及以上),还可以指定微秒精度:

created_at = Column(DateTime(timezone=True), server_default=text('CURRENT_TIMESTAMP(6)'), nullable=False)

要是你需要UTC时间,换成text('UTC_TIMESTAMP()')就行。

2. 确认数据库URL的方言配置

检查你的Flask数据库URL,确保使用的是正确的MySQL+PyMySQL方言格式:

# 示例配置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'

方言指定错误可能会导致SQLAlchemy对函数的解析出现偏差,必须明确是mysql+pymysql

3. 验证生成的SQL语句

你可以开启SQLAlchemy的SQL日志,查看生成的CREATE TABLE语句,确认created_at的默认值是CURRENT_TIMESTAMP而不是字符串'(now())'

app.config['SQLALCHEMY_ECHO'] = True

开启后,启动Flask app时就能在控制台看到生成的SQL,确认默认值配置正确。

为什么之前的方法不行?

你用的func.now()func.current_timestamp()理论上应该生成对应的MySQL函数,但在部分版本的SQLAlchemy(2.0.x)和PyMySQL的组合下,可能出现了函数表达式被错误转义的情况,导致最终生成的是字符串常量而非函数调用。用text()直接传入原生SQL就能绕过这个解析问题。

备注:内容来源于stack exchange,提问作者Lance

火山引擎 最新活动