我正在为一个使用NodeJS的项目做后端.为了管理数据库,我使用了typeorm.

我创建了几个表,没有问题.

现在我try 创建一个新的表(或实体),其中有一个日期列,并且该列使用decorator @CreateDateColumn(),当添加新行时,decorator @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不是问题,因为我已经try 将其设置为Date,结果相同.

当我保存文件,typeormtry 创建表时,这是我返回的结果:

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'

当我注释掉decorator 时,问题就消失了,所以肯定是SQL部分.

在谷歌搜索之后,有人提到SQL版本可能是一个问题.我使用的数据库的SQL版本是Server version: 5.5.62-0ubuntu0.14.04.1

有什么 idea 吗?

推荐答案

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

Mysql相关问答推荐

MySQL连接序列

Ballerina SQL 中是否也应该考虑输入清理?

为什么Mysql会根据查询参数改变查询执行计划?

MySQL 8.0 可以在 Select 语句中返回 JSON 对象数组吗?

Group By 查询运行速度太慢而无法正常运行

如何 Select 具有最新的 2 个日期字段的行?

如何使用 SQL 聚合和求和相似 Select 的值?

将 wordpress 自定义字段转换为单个数组

从 2 个不同的表中获取数据并将它们加入 sql

MySQL 添加一个 NOT NULL 列

如何在mysql select查询中获取两个日期之间的日期列表

如何在mysql中连接整数(整数和整数)和varchar(nvarchar和varchar)等数据类型?

MySQL嵌套 Select 查询?

MySQL 整数与日期时间索引

PHP MySQLI 防止 SQL 注入

将 MySQL 数据库置于版本控制之下?

MySQL中的行值增加和减少1

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

MySQL获取两个值之间的随机值

带有 LIKE 运算符的 Select 语句中的 MySQL case