jOOQ解析器的PostgreSQL语法

jOOQ的解析器不能解析所有可能的SQL语法。试试这个随机的PostgreSQL语法:

ALTER SYSTEM RESET ALL

而jOOQ的解析器会抱怨:

DOMAIN、INDEX、SCHEMA、SEQUENCE、SESSION、TABLE、TYPE或VIEW的预期。[1:7] alter [*]system reset all

这是很好的。jOOQ解析器的目标并不是要理解所有 供应商的特定语法。我们的目标是为jOOQ迄今为止支持的所有语法提供解析器功能,并且能够在方言之间进行翻译。对于很多像上面这样的语法,反正在其他方言中也没有对应的语法。

但是如果你使用jOOQ解析器来模拟数据库迁移,例如创建模式差异,或者使用DDLDatabase生成jOOQ代码,那么你的脚本中可能会有一些你希望jOOQ忽略的厂商特定SQL。例如,上面的命令可能在一个迁移脚本的中间:

CREATE TABLE a (i int);
ALTER SYSTEM RESET ALL;
CREATE TABLE b (i int);

幸运的是,在jOOQ中,你可以在你想告诉jOOQ忽略的命令周围添加特殊标记,jOOQ就会忽略它们。为此,只要启用 [Settings.parseIgnoreComments](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html#parseIgnoreComments)标志,现在你就可以使用一种特殊的注释语法了:

CREATE TABLE a (i int);

/* [jooq ignore start] */
ALTER SYSTEM RESET ALL;
/* [jooq ignore stop] */

CREATE TABLE b (i int);

这些语法对你的RDBMS是透明的,因为它们只是注释。所以,RDBMS会看到并执行这个,就像以前一样。所以,你的实际数据库迁移并没有受到影响:

CREATE TABLE a (i int);

/*                     */
ALTER SYSTEM RESET ALL;
/*                    */

CREATE TABLE b (i int);

但另一方面,jOOQ会以不同的方式解释这些注释,并看到和执行这个:

CREATE TABLE a (i int);

/*

                      */

CREATE TABLE b (i int);

注意,如果你不喜欢[jooq ignore start][jooq ignore stop] 标记,你也可以通过以下方式定制它们 [Settings.parseIgnoreCommentStart](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html#parseIgnoreCommentStart)[Settings.parseIgnoreCommentStop](https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/conf/Settings.html#parseIgnoreCommentStop).

像任何这些纯文本的预处理器语法一样,这完全透明地工作,甚至在一些命令语法中也是如此。假设你在一个CREATE TABLE'sDEFAULT 表达式中使用了一些厂商特有的语法,你可以直接把这个DEFAULT 表达式从jOOQ的解析中排除:

CREATE TABLE t (
  a int 
    /* [jooq ignore start] */ 
    DEFAULT some_fancy_expression() 
    /* [jooq ignore stop] */
);

很明显,你不一定要这样格式化,这只是为了在这个博客上作说明。现在,同样,RDBMS会看到并执行这个:

CREATE TABLE t (
  a int 
    /*                     */ 
    DEFAULT some_fancy_expression() 
    /*                    */
);

而jOOQ的分析器会看到并执行这个:

CREATE TABLE t (
  a int 
    /*

                          */
);

关于这个话题的更多信息,请参考jOOQ手册

猜你喜欢

转载自juejin.im/post/7126362974310105096