如何使用 Gradle 和 Mysql 为单个数据库配置 jooq

Posted

技术标签:

【中文标题】如何使用 Gradle 和 Mysql 为单个数据库配置 jooq【英文标题】:How do I configure jooq with Gradle and Mysql for a single database 【发布时间】:2017-08-17 19:11:03 【问题描述】:

我正在尝试使用 jooq 从 gradle 自动加载配置,但很难按照指南进行操作。

我终于让它加载数据,但到目前为止我只能让所有数据库工作(通过让database() 块为空白)。

我下面的代码尝试只加载一个数据库。

buildscript 

   repositories 
     mavenCentral()
     maven 
       name 'JFrog OSS snapshot repo'
       url  'https://oss.jfrog.org/oss-snapshot-local/'
     
     jcenter()
   

   dependencies 
       classpath 'org.jooq:jooq-codegen:3.9.1'
       classpath group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'
   


apply plugin: 'application'
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'antlr'

repositories 
    mavenLocal()
    mavenCentral()
    jcenter()


dependencies 
    //compile group: 'com.github.javaparser', name: 'javaparser-core', version: '3.0.0-alpha.2'
    compile group: 'com.github.javaparser', name: 'java-symbol-solver-core', version: '0.5.2'
    compile 'org.jooq:jooq:3.9.1'
    runtime group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'
    testCompile "junit:junit:latest.release"


idea 
    module 
        excludeDirs += file('src/main/resources')
    


// Use your favourite XML builder to construct the code generation configuration file
// ----------------------------------------------------------------------------------
def writer = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(writer)
        .configuration('xmlns': 'http://www.jooq.org/xsd/jooq-codegen-3.9.0.xsd') 
    jdbc() 
        driver('com.mysql.cj.jdbc.Driver')
        url('jdbc:mysql://127.0.0.1/graphUpgrade?serverTimezone=UTC')
        user('parseUser')
        password('password')
    
    generator() 
        database() 
            name('org.jooq.util.mysql.MySQLDatabase')
            inputSchema('graphUpgrade')
            includes('.*')
        

        // Watch out for this caveat when using MarkupBuilder with "reserved names"
        // - https://github.com/jOOQ/jOOQ/issues/4797
        // - http://***.com/a/11389034/521799
        // - https://groups.google.com/forum/#!topic/jooq-user/wi4S9rRxk4A
        generate([:]) 
            pojos true
            daos true
        
        target() 
            packageName('us.klingman.codeParser.db')
            directory('src/main/java')
        
    

print writer.toString()
// Run the code generator
// ----------------------
org.jooq.util.GenerationTool.generate(
        javax.xml.bind.JAXB.unmarshal(new StringReader(writer.toString()), org.jooq.util.jaxb.Configuration.class)
)

运行此代码会产生以下错误:

Error while fetching tables
java.lang.NullPointerException
    at org.jooq.util.AbstractElementContainerDefinition.<init>(AbstractElementContainerDefinition.java:79)
    at org.jooq.util.AbstractElementContainerDefinition.<init>(AbstractElementContainerDefinition.java:75)
    at org.jooq.util.AbstractTableDefinition.<init>(AbstractTableDefinition.java:68)
    at org.jooq.util.mysql.MySQLTableDefinition.<init>(MySQLTableDefinition.java:70)
    at org.jooq.util.mysql.MySQLDatabase.getTables0(MySQLDatabase.java:256)
    at org.jooq.util.AbstractDatabase.getTables(AbstractDatabase.java:1137)
    at org.jooq.util.AbstractDatabase.getTable(AbstractDatabase.java:1163)
    at org.jooq.util.AbstractDatabase.getTable(AbstractDatabase.java:1158)
    at org.jooq.util.mysql.MySQLDatabase.getEnums0(MySQLDatabase.java:295)
    at org.jooq.util.AbstractDatabase.getEnums(AbstractDatabase.java:1182)
    at org.jooq.util.JavaGenerator.generateSchemaIfEmpty(JavaGenerator.java:334)
    at org.jooq.util.JavaGenerator.generateCatalogIfEmpty(JavaGenerator.java:323)
    at org.jooq.util.JavaGenerator.generate(JavaGenerator.java:297)
    at org.jooq.util.GenerationTool.run(GenerationTool.java:610)
    at org.jooq.util.GenerationTool.generate(GenerationTool.java:199)
    at org.jooq.util.GenerationTool$generate.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at build_87hklhc6v691dvh83y5ogqnvl.run(/Users/lorenklingman/Sites/code-search-parser/build.gradle:79)
    at org.gradle.groovy.scripts.internal.DefaultScriptRunnerFactory$ScriptRunnerImpl.run(DefaultScriptRunnerFactory.java:74)

最后,为了完整起见,这里是为所有数据库生成的文件。

【问题讨论】:

build.gradle中的第79行是哪一个? javax.xml.bind.JAXB.unmarshal(new StringReader(writer.toString()), org.jooq.util.jaxb.Configuration.class) 【参考方案1】:

相信你在这里遇到过这个问题:#5213

确保在 jOOQ 配置中也始终使用 exact 大写/小写的数据库名称。此外,在 MySQL 和 MariaDB 中有一些区分大小写的注意事项,具体取决于操作系统。这些警告可能会影响除 jOOQ 之外的其他工具。相关信息也在#5213。

【讨论】:

我想我已经做到了,除非你在某个地方看到我错误的大小写 graphUpgrade 是确切的大小写。如果我在 inputSchema 中使用 graphupgrade,我会得到一个不同的错误,即没有模式与我请求的匹配。 @Loren:对不起,我的评论错误/不完整。我已经修好了。你试过只用小写命名你的数据库吗? 对于未来的用户,最好直接在答案中添加大小写。也许“此外,MySQL 和 MariaDB 中存在一些区分大小写的警告,具体取决于操作系统。这些可以通过将数据库命名为全部小写来避免。”还有需要的人,如何在 MySQL/MariaDB 中重命名数据库***.com/a/1072988/3854385

以上是关于如何使用 Gradle 和 Mysql 为单个数据库配置 jooq的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 和 MYSQL 在单个单元格数据库中插入/存储多个项目

如何将数据从多个输入字段转换为单个 JSON 对象以进一步将其插入单个 mysql 字段

如何从命令行运行单个 gradle 任务

如何在我的gradle项目中创建单个可执行的jar?

如何使用单个build.gradle配置向kotlin多平台项目添加依赖项

如何使用 gradle 中的复制任务复制目录