在groovy sql中使用Ant属性中的数据库模式名称

时间:2015-09-04 19:32:43

标签: sql groovy ant

我正在尝试在Ant

中执行如下的groovy sql select
<target name="groovy_sql">
    <groovy>
        import groovy.sql.Sql
        def sql = Sql.newInstance(properties."master.jdbc_connection_string", properties."master.database_user", properties."master.database_password", "net.sourceforge.jtds.jdbc.Driver")
        def table = '['+properties."app.database_name"+']..FILE_DATA'
        def row = sql.firstRow("SELECT top 1 id from ${table} order by id desc")
        properties."fileDataId" = row[0]
    </groovy>
    <echo message="fileDataId: ${fileDataId}"/>
</target>

我的错误

 [groovy] Sep 04, 2015 2:16:14 PM groovy.sql.Sql$AbstractQueryCommand execute
 [groovy] WARNING: Failed to execute: SELECT top 1 id from ? order by id desc because: Must declare the table variable "@P0".

我认为这个错误的原因是表名不能作为参数传递。 由于此脚本必须在不同的环境中运行,因此我们在不同的环境中使用不同的模式,因此我无法对模式名称进行硬编码,而且我很难找到解决方案。有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您可以拆分字符串赋值。首先从项目中读取,然后连接。

以下是从命令行获取属性的示例

<?xml version="1.0"?>
<project name="demo" basedir="." default="demo">

<taskdef name="groovy"
classpath="${user.home}/.gvm/groovy/2.3.6/embeddable/groovy-all-2.3.6.jar"
classname="org.codehaus.groovy.ant.Groovy" />

    <target name="demo">
        <!-- can load all props from a file here-->
        <property name="table" value="hardcoded"/>
        <groovy>
            <arg value="hello1"/>
             <arg value="hello2"/>
             <arg value="hello3"/>

             println  args[0]
             println  args[2]
             println 'projectName:'+ project.name
             println project.getProperty("table")

             def var="SELECT top 1 id from " + project.properties["table"] + "  order by id desc"
             println var;

        </groovy>

    </target>


</project>

我没有sql环境来测试它,所以我只是打印。

以下显示了跑步的输出

  

$ ant

demo:                                                                                
   [groovy] hello1                                                                   
   [groovy] hello3                                                                   
   [groovy] projectName:demo                                                         
   [groovy] hardcoded                                                                
   [groovy] SELECT top 1 id from hardcoded  order by id desc                         

采用命令行参数

$ ant -Dtable=newtable


demo:                                                                                
   [groovy] hello1                                                                   
   [groovy] hello3                                                                   
   [groovy] projectName:demo                                                         
   [groovy] newtable                                                                 
   [groovy] SELECT top 1 id from newtable  order by id desc