Как я могу написать следующий запрос, используя строки шаблона es6?

connection.query('\
CREATE TABLE `' + dbconfig.database + '`.`' + dbconfig.users_table + '` ( \
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, \
    `username` VARCHAR(20) NOT NULL, \
    `password` CHAR(60) NOT NULL, \
        PRIMARY KEY (`id`), \
    UNIQUE INDEX `id_UNIQUE` (`id` ASC), \
    UNIQUE INDEX `username_UNIQUE` (`username` ASC) \
)');

Есть ли другой лучший способ написания многострочных запросов sql?

6
Soli 31 Дек 2017 в 20:33

2 ответа

Лучший ответ

В ES6 вы можете использовать шаблонные литералы, поскольку они разрешено быть многострочным.

connection.query(`CREATE TABLE ${dbconfig.database}.${dbconfig.users_table} ( 
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    username VARCHAR(20) NOT NULL, 
    password CHAR(60) NOT NULL, 
        PRIMARY KEY (id), 
    UNIQUE INDEX id_UNIQUE (id ASC), 
    UNIQUE INDEX username_UNIQUE (username ASC) 
)`);
8
Flying 31 Дек 2017 в 17:43

Несмотря на то, что строки шаблона работают должным образом, мне трудно читать, проверять и форматировать SQL-запросы, помещенные в них.

Я предпочитаю иметь служебную функцию, которая загружает запрос в виде строки из файла при запуске приложения.

Вот пример этой служебной функции на TypeScript:

import {existsSync, readFileSync} from 'fs'

export const loadQuery = (queryFileName: string) => {
    const path = `src/queries/${queryFileName}.sql`

    if (!existsSync(path)) {
        process.exit(1)
    }

    return readFileSync(path, 'utf8')
}

Теперь у меня есть файл SQL, который я могу автоматически форматировать с помощью любого удобного инструмента:

SELECT
    article.title,
    article.description,
    article.created_by,
    article.company_id
FROM articles article
     INNER JOIN users usr ON
                          usr.company_id = article.company_id AND
                          usr.email = $1
ORDER BY article.title;

Что выглядит так в WebStorm с установленным плагином форматирования SQL:

SQL formatted

В конце концов, я называю это так (пример конечной точки Koa / Express):

import {dbClient} from '../dbClient'
import {loadQuery} from './loadQuery'

const getUserCompanyArticlesQuery = loadQuery('getUserCompanyArticles')

export const getUserCompanyArticles = async (email: string) => {
    const result = await dbClient.query(
        getUserCompanyArticlesQuery,
        [email])

    return result.rows
}

Плюсы:

  1. Автоформатирование SQL.
  2. Отделение SQL-запросов от кода для улучшения читаемости.
  3. Я могу быстро увидеть сам запрос, когда мне нужно отладить.

Минусы:

  1. Вы должны иметь и загружать внешний файл из файловой системы при запуске приложения.
2
Sergei Basharov 11 Фев 2020 в 16:15