如何从头创建数据库,创建表并使用一些示例数据填充它们,在MySQL,SQL Server和Oracle中使用单个ANT构建?
答案 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来处理。