使用TypeORM创建含@CreateDateColumn的表时出现SQL语法错误
解决思路
1. 适配MySQL 5.5的日期语法
MySQL 5.5不支持带微秒精度的datetime(6)语法,也不允许CURRENT_TIMESTAMP加精度参数,这是触发SQL解析错误的直接原因。需要给@CreateDateColumn指定兼容参数:
@CreateDateColumn({ type: "datetime", precision: null, // 关闭微秒精度,适配MySQL 5.5 default: () => "CURRENT_TIMESTAMP" // 显式指定符合旧版本的默认值语法 }) created_at: Date; // 推荐用Date类型,TypeORM会自动完成与数据库的类型映射
2. 规避MySQL保留关键字
order是MySQL的保留关键字,直接用作表名会存在语法冲突风险。修改实体的表名:
@Entity("orders") // 将表名改为非关键字的名称,比如orders export class Order { // ... 其他字段定义保持不变 }
3. 验证修改后的SQL生成
调整后TypeORM会生成兼容MySQL 5.5的SQL语句:
CREATE TABLE `orders` (`id` int NOT NULL AUTO_INCREMENT, `first_name` varchar(255) NOT NULL, `last_name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=InnoDB
该语句符合MySQL 5.5的语法规范,可正常执行。
额外提示
MySQL 5.5已停止官方维护,建议尽量升级到5.7及以上版本以获得更好的兼容性和安全性。如果暂时无法升级,后续使用@UpdateDateColumn等日期相关装饰器时,同样需要添加precision: null参数来适配旧版本语法。
内容的提问来源于stack exchange,提问作者user1869935
相关产品推荐
相关产品推荐

