首页 > 解决方案 > 将 CSV 导入 MariaDB 时出现语法错误

问题描述

下午,

我正在尝试生成到我的数据库的新迁移,以使用 CSV 文件导入新的数据集,遗憾的是我遇到了一些语法错误,我似乎没有在网上找到遮阳篷。

我正在使用 TypeOrm 生成我的迁移:

import {MigrationInterface, QueryRunner} from 'typeorm';

export class UploadTechnicalInformationsRectangular1604481796356 implements MigrationInterface {

    public async up(queryRunner: QueryRunner): Promise<any> {
        await queryRunner.query('LOAD DATA LOCAL INFILE `../data/RSH-rectangular.csv` INTO TABLE `technical-information` FIELDS TERMINATED BY `;` ENCLOSED BY `"` LINES TERMINATED BY `\r\n`',undefined);
    }

    public async down(queryRunner: QueryRunner): Promise<any> {
    }

}

我尝试在我的项目中加载本地存储的文件并在后台将其注入我正在运行的数据库表中,我收到以下错误:

QueryFailedError: ER_PARSE_ERROR: 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以../data/RSH-rectangular.csv在第 1 行的“INTO TABLE 技术信息字段终端...”附近使用正确的语法

我已经没有想法了我的语法有什么问题我尝试删除反引号,替换为单引号/双引号。

CSV 列名称与我的表列名称相同。数据的唯一区别是,根据我导入的数据集的类型,我将在某些列而不是其他列中有数据。但是我还没到呢^^

在从 Excel(MS-DOS、分号、逗号)导出时,我还尝试了不同的 CSV 格式,到目前为止,它们的反应似乎都是一样的。

网络之神,给我指路

基于@bill-karwin 解决方案的最终答案:

await queryRunner.query("LOAD DATA LOCAL INFILE './src/data/CSH.csv' INTO TABLE `technical-information` FIELDS TERMINATED BY ';' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 ROWS  (type, outsideDiameter, thickness, massUnitLength, crossSectionalArea, secondMomentArea, gyrationRadius, elasticSectionModulus, plasticSectionModulus, torsionalIniertiaConstant, torsionalModulusConstant, superficialAreaMeterLength, availibilityUpon, dimensionOutsideValidRange)", undefined);

标签: mysqlmariadbmigrationtypeorm

解决方案


你有不属于他们的反引号。

反引号表示 MySQL 标识符(数据库、表、列、别名等),而不是文本字符串。

尝试'使用字符代替您的文本字符串。您的查询中的许多地方都有反引号。这是做什么

  1. 从查询中删除所有反引号,用引号替换它们'
  2. 恢复反引号,使它们仅围绕 MySQL 标识符(在您的查询中,您的表的名称)。
  3. 弄清楚如何将整个查询用作编程语言中的文本字符串。将它包裹在 `"`` 双引号而不是单引号中可能对您有用。

这个,没有调试,可能会为你做。

const q = 
   "LOAD DATA LOCAL INFILE '../data/RSH-rectangular.csv' \
        INTO TABLE `technical-information` \
        FIELDS TERMINATED BY ';' \
        ENCLOSED BY '\"' \
        LINES TERMINATED BY '\r\n';";
await queryRunner.query(q,undefined);

如果 CSV 文件的第一行包含列名,请添加IGNORE 1 ROWSLOAD命令中。

在 Javascript 中,反引号表示模板字符串。您不需要模板字符串,只需一个普通字符串。所以用"引号分隔它并通过将 \ 放在每行的末尾来转义其中的换行符。

在 MySQL 中,反引号表示 MySQL 标识符,单引号表示文本字符串。

SQL 是一种语言,Javascript 是另一种语言。您在 Javascript 中嵌入 SQL 命令。正确设置分隔符和转义符是 xxx 脖子上的一个臭名昭著的痛苦。console.log()在调试时自由使用。


推荐阅读