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手册。