寻找可嵌入的SQL美化工具或格式化工具

31
8个回答

55

更新2:

org.hibernate.jdbc.util.BasicFormatterImpl 在4.0版本中已经移动,现在位于:org.hibernate.engine.jdbc.internal.BasicFormatterImpl

更新1:

技术不断发展。正如Alex所指出的那样,org.hibernate.pretty.Formatter 从3.3.2.GA版本开始已不再存在,它的替代品是org.hibernate.jdbc.util.BasicFormatterImpl

String formattedSQL = new BasicFormatterImpl().format(sql);
如果你在使用Hibernate,它内置了一个东西:org.hibernate.pretty.Formatter
String formattedSQL = new Formatter(sql).format();

1
或者使用DDLFormatter,它可以a)在每个逗号后插入换行符;b)在每个插入的换行符后缩进三个空格。 - Stephen Denne
这似乎正是我正在寻找的。Hibernate已经是我的解决方案的核心组件,因此它不会引入新的依赖关系。 - Brian Matthews
1
FYI,BasicFormatterImpl无法处理注释“--”,而DDLFormatter甚至更为原始,请参见http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/pretty/DDLFormatter.html#format()。 - Karl
2
我创建了一个独立的 SQL 美化工具,它使用 BasicFormatterImplDDLFormatterImpl。https://github.com/lbtc-xxx/sql-beautifulier - Kohei Nozaki
看看 Yohei Yyamana 的 SQL 格式化程序吧。它是 Java 编写的,开源的,零依赖的,并且已经在 Maven 中央仓库中了! https://github.com/vertical-blank/sql-formatter - Choppy The Lumberjack

6

在Hibernate v3.3.2.GA中,org.hibernate.pretty.Formatter已经不存在了。

你可以使用它的替代品:org.hibernate.jdbc.util.BasicFormatterImpl

对于Hibernate 4.0+,请使用org.hibernate.engine.jdbc.internal.BasicFormatterImpl

Formatter f = new BasicFormatterImpl();
String formatted_sql_code = f.format(ugly_sql_code);

5

SQL Development Tools Project是eclipse Data Tools Platform的一部分。

介绍如何使用SQL Query Parser的页面中,对SQLQuerySourceFormat的使用说明非常简单,其提供以下选项:

  • preserveSourceFormat = 在生成SQL源文本时保留输入源格式选项
  • statementTerminator = 分隔多个SQL语句的字符
  • hostVariablePrefix = 主机语言变量前缀字符
  • parameterMarker = 标识主机语言参数的字符
  • delimitedIdentifierQuote* = 包含保留大小写标识符的字符
  • omitSchema = 当前模式(在SQL源中省略,隐含于未限定的表引用中)
  • qualifyIdentifiers = SQL源中标识符的合格标志
  • preserveComments = 保留解析SQL源或/和生成SQL源中的注释选项
  • generateCommentsForStatementOnly = 仅在完整语句的上下文中为SQL源生成注释的选项,或者如果设置为false,则还为单个SQL查询对象在语句上下文之外生成注释

这个解决方案对我来说肯定可行,但我更喜欢 Hibernate 解决方案的简洁性。遗憾的是我只能给你一个 +1。 - Brian Matthews

2

你有没有考虑过:

http://www.sqlinform.com

他们提供API版本和命令行版本(还有在线版本)。

不过我不清楚费用情况。


1

也许 jsqlparser 对你有用。

并不像你想象的那么容易找到,因为有很多已经废弃的项目。实际上,我没有找到它,所以最终自己做了一个(基于H2解析器——如果一切都失败了,可以联系我)。因此,我不知道它是否有美化程序,但在上面编写一个应该足够简单明了。

它基于语法和JavaCC,所以与其用antlr重新发明轮子,可能更好的选择。您可能会发现,如果需要支持复杂语句中各种方言的SQL,任何基于语法的方法都会让您失望。


1

1
我需要能够在离线状态下执行此操作,因为它是在我的构建过程中的代码生成步骤之后进行的。因此,SQL格式化程序对我来说不是一个选项。 - Brian Matthews

0
你可以使用 SQL 语法 并使用 antlr 构建 AST。然后,您可以以任何格式输出树。

谢谢。那将是我的最后手段计划。幸运的是,我现在忙于新工作,希望在我不得不动手之前能得到答案。 - Brian Matthews

0

所以这绝对是您在寻找的:支持Oracle、SQL Server、DB2、MySQL、Teradata和PostgreSQL的SQL格式化程序库


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接