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

kzipqqlq  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(364)

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

wecizke3

wecizke31#

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

myss37ts2#

即使模板字符串按预期工作,我也很难读取、验证和格式化放入其中的sql查询。
我更喜欢有一个实用函数,从appstart上的文件中以字符串的形式加载查询。
下面是此实用程序函数的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;

在安装了sql格式化插件的webstorm中是这样的:

最后,我这样称呼它(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
}

赞成的意见:
sql的自动格式化。
将sql查询与代码分离,从而提高可读性。
当我需要调试时,我可以很快看到查询本身。
欺骗:
运行应用程序时,必须从文件系统中获取并加载一个外部文件。

相关问题