如何从单个ANT构建中在MySQL,SQL Server和Oracle中创建数据库?

时间:2011-12-30 04:44:23

标签: mysql sql-server oracle ant

如何从头创建数据库,创建表并使用一些示例数据填充它们,在MySQL,SQL Server和Oracle中使用单个ANT构建?

4 个答案:

答案 0 :(得分:2)

我们对 ant mysql 的处理方式如下:

准备这样的SQL文件:

drop database if exists test;
create database test character set utf8;
use test;

create table Account_ (
...fields
) engine InnoDB;

create .... more tables ...

使用这样的ant脚本:

<exec executable="mysql" input="test.sql" />

所以我认为你必须处理的主要问题是生成示例sql文件,而不是使用Ant。

我们正在做的是编写一个sample-sql-builder,它根据ftl文件生成数据(显示表结构)。我们只是从ant运行它,所有逻辑都在纯java中。

答案 1 :(得分:2)

如果您需要管理多DBMS架构定义,我建议使用类似Liquibase的内容。

Liquibase架构定义与DBMS无关,Liquibase将为您处理各种方言的翻译。您仍然可以在架构定义中使用DBMS特定代码。

Liquibase有一个Ant task,因此您可以将其集成到您的构建脚本中。但是,由于您基本上可以从Ant中调用任何Java程序,因此您也可以使用“普通”命令行模式。

请注意,Oracle世界中的“创建数据库”通常意味着创建一个完整的实例,这肯定不是您想要的(DBA当然不允许这样做)

答案 2 :(得分:1)

没有人提到它,但你也可以使用ant sql任务。下面是我使用的蚂蚁宏。宏取决于多年来从.properties文件读入的一系列属性我使用Postgres,Oracle,MySQL,DB2,MS SQL Server

这个宏的变体
<macrodef name="oracle-admin">
    <attribute name="sqlfile" />
    <attribute name="onerror" default="continue" />
    <attribute name="autocommit" default="true" />
    <attribute name="expandproperties" default="true" />
    <attribute name="delimitertype" default="normal" />
    <sequential>
        <sql 
            driver="oracle.jdbc.OracleDriver" 
        url="${oracle.url}" 
        userid="${oracle.db.admin.user}" 
        password="${oracle.db.admin.password}" 
        classpath="${oracle.jdbc.jar}" 
        expandproperties="@{expandproperties}"
        keepformat="true"
        delimitertype="@{delimitertype}"
        rdbms="oracle"
        onerror="@{onerror}"  

        print="true"
        autocommit="@{autocommit}">

           <transaction src="@{sqlfile}"> </transaction>
        </sql>
       </sequential>        
    </macrodef>

宏被提供一个SQL文件,sql文件可以包含ant属性,这些属性将被属性文件中的值替换。

CREATE ROLE ${postgres.db.user} 
WITH   
       LOGIN
       PASSWORD '${postgres.db.password}';

CREATE DATABASE ${postgres.db.database}
       OWNER ${postgres.db.user}
       ENCODING='UTF8';

答案 3 :(得分:0)

一种选择是维护不同的sql脚本并使用exec task从ant运行它们。第二个选项是使用单个元信息文件,从中为数据库生成适当的sql,然后使用exec任务。

我同意liquibase将是最优雅的开源解决方案。您可能需要一些manual steps.

我们所做的有点不同。我们创建自定义java程序,而不是加载sql和进行jdbc调用。这工作,最薄弱的部分将是解析.sql文件。使用java task

从ant任务调用此java程序

数据库创建 - 这可以自动化 - 但与数据库服务器紧密耦合。 Oracle dbca有命令行。如果这是针对某种内部部署,比如说测试?在这种情况下,使用不同的模式就足够了 - 可以通过jdbc来处理。