Escreva consultas MySQL multilinhas em JavaScript usando a tag

No MySQL, se um identificador contém caracteres especiais ou é uma palavra reservada, você deve citá-lo sempre que se referir a ele. O caractere de aspas do identificador é o crase ( `).

Palavras-chave não reservadas são permitidas como identificadores sem aspas. No entanto, é um hábito saudável citar todos os identificadores para evitar a colisão acidental com palavraschave, palavras reservadas e nomes de funções integradas .

Não há problema em escrever consultas MySQL de linha única porque você pode usar aspas simples ou duplas, por exemplo

const = 'SELECT `p1`.`id`, `p1`.`name`, `t1`.`id` `tagId`, `t1`.`name` `tagName` FROM `page` `p1` INNER JOIN `page_tag` `pt1` ON `pt1`.`page_id` = `p1`.`id` GROUP BY `p1`.`id` HAVING COUNT(`pt1`.`id`) = 4';

No entanto, escrever uma consulta longa em uma única linha prejudica a legibilidade da consulta. Você não pode usar literais de modelo porque a sintaxe entra em conflito com o caractere de aspas do identificador MySQL.

Um proponente da sintaxe de literais de modelo irá argumentar que você pode escapar do caractere crase, por exemplo

const = `
SELECT

`p1`
.`id`,
`p1`
.`name`,
`t1`
.`id` `tagId`,
`t1`
.`name` `tagName`
FROM

`page` `p1`

INNER JOIN

`page_tag` `pt1`

ON

`pt1`
.`page_id` = `p1`.`id`
GROUP BY

`p1`
.`id`
HAVING

COUNT
(`pt1`.`id`) = 4
`;

No entanto, essa abordagem tem várias desvantagens:

  • Isso torna difícil ler a consulta.
  • Você não pode copiar a consulta entre o IDE e um cliente SQL (como costuma ser o fluxo de trabalho).

Como resultado, a prática estabelecida para escrever consultas MySQL que abrangem várias linhas é armazená-las em um arquivo separado. Esta é uma boa abordagem, esp. para consultas muito longas. No entanto, às vezes você deseja ter consultas no arquivo, por exemplo, durante a prototipagem ou se você simplesmente preferir.

É aqui que babel-plugin-transform-jsx-element-to-string-literalentra o. Você pode declarar qualquer consulta usando elementos JSX:

const = <sql>
SELECT

`p1`.`id`,
`p1`.`name`,
`t1`.`id` `tagId`,
`t1`.`name` `tagName`
FROM

`page` `p1`
INNER JOIN

`page_tag` `pt1`
ON

`pt1`.`page_id` = `p1`.`id`
GROUP BY

`p1`.`id`
HAVING

COUNT
(`pt1`.`id`) = 4
</sql>;

Nota:
O exemplo acima está usando {"tagNames": ["sql"]}configuração.