如何编写多行sql查询(nodejs)

时间:2017-12-31 17:33:46

标签: mysql sql ecmascript-6

如何使用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查询吗?

2 个答案:

答案 0 :(得分:6)

在ES6中,您可以使用template literals,因为它们可以是多行的。

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) 
)`);

答案 1 :(得分:1)

即使模板字符串按预期工作,但我仍然很难读取,验证和格式化其中的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. 在以下情况下,您必须具有并从文件系统加载外部文件: 运行该应用。