我正在使用 NodeJS 为一个项目做后端。为了管理我正在使用的数据库
typeorm
。
我创建了几个表,没有任何问题。
现在我正在尝试创建一个具有日期列的新表(或实体),并且该列使用装饰器
@CreateDateColumn()
,它应该在添加新行时插入当前日期,如下所示:
@Entity()
export class Order{
@PrimaryGeneratedColumn()
id: number
@Column()
first_name: string
@Column()
last_name: string
@Column()
email: string
@CreateDateColumn() //This one here
created_at: string
@OneToMany(() => OrderItem, orderItem => orderItem.order)
order_items: OrderItem[]
}
事实上,我将类型设置为
string
不是问题,因为我尝试将其设置为 Date
并获得相同的结果。
当我保存文件并
typeorm
尝试创建表格时,这就是我得到的结果:
code: 'ER_PARSE_ERROR',
errno: 1064,
sqlState: '42000',
sqlMessage: "You have an error in your SQL syntax near '(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY (`id`)) ENGINE=InnoDB' at line 1",
sql: 'CREATE TABLE `order` (`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(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY (`id`)) ENGINE=InnoDB'
当我注释掉装饰器时,问题就消失了,所以肯定是 SQL 部分。
在谷歌搜索后,有人提到 SQL 版本可能是一个问题。我正在使用的数据库的 SQL 版本是
Server version: 5.5.62-0ubuntu0.14.04.1
有什么想法吗?
语法错误是因为 TypeORM 试图以微秒精度将列定义为
created_at DATETIME(6)
。
这会在 MySQL 5.5 上导致错误,因为直到 MySQL 5.6 才实现小数日期时间数据类型。
阅读https://github.com/typeorm/typeorm/issues/609,了解有关支持小数日期时间的 MySQL 版本的来回讨论,同时为不支持小数日期时间的旧版本提供解决方法不支持。
您应该能够显式定义数据类型,如该问题中所述。
老实说,你应该将 MySQL 版本升级到 8.0 版本。 5.6 版本于 2021 年到期,5.7 版本于 2023 年到期。请参阅https://endoflife.date/mysql
您仍在使用 2010 年的 MySQL 5.5 版本,因此不支持现代功能也就不足为奇了,并且 TypeORM 假设您使用的是更新版本也没有错。