SQL Formatter是一个用于漂亮打印 SQL 查询的 JavaScript 库。
它最初是作为 PHP 库的一个端口,但后来发生了很大的变化。
它支持各种 SQL 方言:GCP BigQuery、IBM DB2、Apache Hive、MariaDB、MySQL、TiDB、Couchbase N1QL、Oracle PL/SQL、PostgreSQL、Amazon Redshift、SingleStoreDB、Snowflake、Spark、SQL Server Transact-SQL、Trino(和 Presto) )。有关更多详细信息,请参阅语言选项文档。
它不支持:
;
以外的其他类型。→ 尝试演示。
从 NPM 获取最新版本:
npm install sql-formatter
也可用于纱线:
yarn add sql-formatter
import { format } from 'sql-formatter' ;
console . log ( format ( 'SELECT * FROM tbl' , { language : 'mysql' } ) ) ;
这将输出:
SELECT
*
FROM
tbl
您还可以传入配置选项:
format ( 'SELECT * FROM tbl' , {
language : 'spark' ,
tabWidth : 2 ,
keywordCase : 'upper' ,
linesBetweenQueries : 2 ,
} ) ;
您可以通过用禁用/启用注释包围 SQL 部分来禁用它的格式化程序:
/* sql-formatter-disable */
SELECT * FROM tbl1;
/* sql-formatter-enable */
SELECT * FROM tbl2;
其产生:
/* sql-formatter-disable */
SELECT * FROM tbl1;
/* sql-formatter-enable */
SELECT
*
FROM
tbl2;
格式化程序甚至不解析这些注释之间的代码。因此,如果某些 SQL 碰巧导致 SQL Formatter 崩溃,您可以将罪魁祸首注释掉(至少直到问题在 SQL Formatter 中得到解决)。
除了格式化之外,该库还可以在准备好的 SQL 语句中执行占位符替换:
format ( 'SELECT * FROM tbl WHERE foo = ?' , {
params : [ "'bar'" ] ,
} ) ;
结果:
SELECT
*
FROM
tbl
WHERE
foo = ' bar '
有关更多详细信息,请参阅 params 选项的文档。
CLI 工具将安装在sql-formatter
下,并可以通过npx sql-formatter
调用:
sql-formatter -h
usage: sql-formatter [-h] [-o OUTPUT]
[-l {bigquery,db2,db2i,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,tidb,transactsql,trino,tsql}] [-c CONFIG] [--version] [FILE]
SQL Formatter
positional arguments:
FILE Input SQL file (defaults to stdin)
optional arguments:
-h, --help show this help message and exit
-o, --output OUTPUT
File to write SQL output (defaults to stdout)
--fix Update the file in-place
-l, --language {bigquery,db2,db2i,hive,mariadb,mysql,n1ql,plsql,postgresql,redshift,singlestoredb,snowflake,spark,sql,sqlite,tidb,trino,tsql}
SQL dialect (defaults to basic sql)
-c, --config CONFIG
Path to config JSON file or json string (will find a file named '.sql-formatter.json' or use default configs if unspecified)
--version show program's version number and exit
默认情况下,该工具从 stdin 获取查询并将其处理到 stdout,但也可以命名输入文件名或使用--output
选项。
echo ' select * from tbl where id = 3 ' | sql-formatter
select
*
from
tbl
where
id = 3
该工具还接受当前目录或任何父目录中名为 .sql-formatter.json 的 JSON 配置文件,或者使用采用以下形式的--config
选项:
{
"language" : " spark " ,
"tabWidth" : 2 ,
"keywordCase" : " upper " ,
"linesBetweenQueries" : 2
}
所有字段都是可选的,所有未指定的字段都将填充其默认值。
language
要使用的 SQL 方言(使用format()
时)。dialect
要使用的 SQL 方言(自版本 12 起使用formatDialect()
时)。tabWidth
要使用的缩进量。useTabs
使用制表符进行缩进。keywordCase
大写或小写关键字。dataTypeCase
大写或小写数据类型。functionCase
大写或小写函数名称。identifierCase
大写或小写标识符。 (实验性的! )indentStyle
定义整体缩进样式。 (已弃用! )logicalOperatorNewline
布尔运算符(AND、OR、XOR)之前或之后的换行符。expressionWidth
括号表达式中要保留在单行上的最大字符数。linesBetweenQueries
在查询之间插入多少换行符。denseOperators
将运算符密集地封装在一起,没有空格。newlineBeforeSemicolon
将分号放在单独的行上。params
用于占位符替换的值集合。paramTypes
指定要支持的参数占位符类型。如果您不使用模块捆绑器,请克隆存储库,运行npm install
并从/dist
目录获取文件以在<script>
标记内使用。这使得 SQL Formatter 可用作全局变量window.sqlFormatter
。
最常见的原因是您没有指定 SQL 方言。而不是简单地调用库:
format ( 'select [col] from tbl' ) ;
// Throws: Parse error: Unexpected "[col] from" at line 1 column 8
选择正确的方言,例如:
format ( 'select [col] from tbl' , { language : 'transactsql' } ) ;
或者使用 VSCode 扩展时:设置 -> SQL-Formatter-VSCode: SQLFlavourOverride。
当将应用程序与 Webpack 捆绑在一起时,通常会发生这种情况。原因是 Babel (通过babel-loader
)未配置为支持类属性语法:
| export default class ExpressionFormatter {
> inline = false;
此语法在所有主要浏览器(旧版 IE 除外)中得到广泛支持,并且默认的@babel/preset-env
中包含对它的支持。
可能的修复:
@babel/preset-env
@babel/plugin-proposal-class-properties
Prettier SQL VSCode 扩展不再由其作者维护。
请使用官方 SQL Formatter VSCode 扩展从 SQL Formatter 库获取最新修复。
例如,您可能有如下 SQL:
SELECT {col1}, {col2} FROM {tablename}
虽然 SQL Formatter 不直接支持模板,但解决方法是使用 paramTypes 配置选项将这些出现的模板结构视为准备好的语句参数占位符:
format ( 'SELECT {col1}, {col2} FROM {tablename};' , {
paramTypes : { custom : [ { regex : String . raw `{w+}` } ] } ,
} ) ;
这并不适用于所有可能的模板结构,但应该可以解决最常见的用例。
该格式化程序的开发目前处于维护模式。如果可行,错误将得到修复,但可能不会添加新功能。
我启动了一个新的 SQL 格式化工具:prettier-plugin-sql-cst。
如果您想将 SQL 自动格式化提升到一个新的水平,请尝试一下。
请参阅 CONTRIBUTING.md
麻省理工学院