如何从零开始创建数据库,在MySQL, SQL Server以及Oracle中创建表并填充一些示例数据?
我们对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的
如果你需要管理一个多dbms模式定义,我建议使用像Liquibase这样的东西。
Liquibase模式定义与dbms无关,Liquibase将为您处理转换成各种方言的问题。但是,您仍然可以在模式定义中使用特定于DBMS的代码。
Liquibase有一个Ant任务,所以你可以把它集成到你的构建脚本中。但是,由于基本上可以从Ant中调用任何Java程序,因此也可以使用"普通"命令行模式。
请注意,在Oracle世界中,"创建一个数据库"通常意味着一个完整的实例创建,这肯定不是你想要的(也肯定不是DBA允许的)
没有人提到它,但是您也可以使用ant sql任务。下面是我使用的ant宏。这个宏依赖于一堆属性,这些属性是从一个。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文件可以包含两个属性,这些属性将被属性文件中的值所替换。
CREATE ROLE ${postgres.db.user}
WITH
LOGIN
PASSWORD '${postgres.db.password}';
CREATE DATABASE ${postgres.db.database}
OWNER ${postgres.db.user}
ENCODING='UTF8';
一种选择是维护不同的sql脚本,并使用exec任务从ant运行它们。第二种选择是有一个元信息文件,从中你为数据库生成合适的sql,然后使用exec任务。
我同意liquidbase将是最优雅的开源解决方案。您可能需要一些手动步骤。
我们所做的有点不同。我们创建自定义java程序来加载sql并进行jdbc调用。这是可行的,最薄弱的部分将是解析.sql文件。这个java程序是从ant任务中调用的,使用java task
数据库创建-这可以自动化-但与数据库服务器紧密耦合。Oracle dbca有命令行。如果这是用于某种内部部署,比如测试?在这种情况下,使用不同的模式就足够了——这可以通过jdbc处理。