代码之家  ›  专栏  ›  技术社区  ›  user1869935

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

  •  1
  • user1869935  · 技术社区  · 1 年前

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

    我已经创建了几个没有问题的表。

    现在我正试图创建一个新的表(或实体),该表有一个日期列,该列使用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 不是问题所在,正如我所努力做到的那样 Date 具有相同的结果。

    当我保存文件和 打字 尝试创建表,这是我得到的结果:

    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

    有什么想法吗?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Bill Karwin    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认为您使用的是更新的版本也没有错。