尝试使用 TypeORM 创建新表时出现 SQL 语法错误

问题描述 投票:0回答:1

我正在使用 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

有什么想法吗?

sql mysql node.js typeorm
1个回答
0
投票

语法错误是因为 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 假设您使用的是更新版本也没有错。

© www.soinside.com 2019 - 2024. All rights reserved.