Comment créer une database dans MySQL, SQL Server et Oracle à partir d'une seule compilation ANT?

Comment puis-je créer une database à partir de rien, en créant les tables et en les remplissant avec des exemples de données, dans MySQL, SQL Server et Oracle en utilisant une seule compilation ANT?

Ce que nous faisons avec ant et mysql est comme ceci:

Préparez un file SQL comme ceci:

 drop database if exists test; create database test character set utf8; use test; create table Account_ ( ...fields ) engine InnoDB; create .... more tables ... 

Utilisez le script de la fourmi comme ceci:

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

Donc je pense que le problème principal que vous avez à traiter est de générer un file sql, sans travailler avec Ant.

Ce que nous faisons est d'écrire un exemple-sql-builder qui génère des données en fonction des files ftl (qui montre les structures de la table). Nous venons de le lancer de la fourmi, la logique est en Java pur.

Je recommand d'utiliser quelque chose comme Liquibase si vous avez besoin de gérer une définition de schéma multi-SGBD.

La définition du schéma de Liquibase est indépendante du SGBD et Liquibase s'occupera de la traduction dans les différents dialectes pour vous. Vous pouvez toujours avoir du code spécifique au SGBD dans la définition du schéma.

Liquibase a une tâche Ant pour que vous puissiez l'intégrer dans votre script de construction. Mais comme vous pouvez appeler n'importe quel programme Java depuis Ant, vous pouvez aussi utiliser le mode de command line "normal".

Notez que "créer une database" dans le monde Oracle signifie généralement une création d'instance complète qui n'est certainement pas ce que vous voulez (et ne sera certainement pas autorisé à faire par le DBA)

Personne ne l'a mentionné mais vous pouvez également utiliser la tâche ant sql. Voici une macro de fourmi que j'utilise. La macro dépend d'un tas de propriétés qui sont lues à partir d'un file .properties au cours des années, j'ai utilisé des variantes de cette macro avec Postgres, Oracle, MySQL, DB2, MS SQL Server

 <macrodef name="oracle-admin"> <atsortingbute name="sqlfile" /> <atsortingbute name="onerror" default="continue" /> <atsortingbute name="autocommit" default="true" /> <atsortingbute name="expandproperties" default="true" /> <atsortingbute 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> 

La macro est alimentée par un file SQL, le file sql peut contenir des propriétés ant qui seront remplacées par les valeurs du file de propriétés.

 CREATE ROLE ${postgres.db.user} WITH LOGIN PASSWORD '${postgres.db.password}'; CREATE DATABASE ${postgres.db.database} OWNER ${postgres.db.user} ENCODING='UTF8'; 

Une option consiste à gérer différents scripts sql et à les exécuter depuis ant en utilisant exec task . La deuxième option consistera à avoir un seul file de méta-informations à partir duquel vous générez le sql approprié pour la database, puis utilisez la tâche exec.

Je suis d'accord que liquibase sera la solution open source la plus élégante pour vous. Vous pouvez avoir besoin de quelques étapes manuelles.

Ce que nous faisons est un peu différent. Nous créons un programme java personnalisé qui peut charger sql et faire des appels jdbc. Cela fonctionne, la partie la plus faible sera dans l'parsing des files .sql. Ce programme java est appelé depuis la tâche ant, en utilisant la tâche java

Création de database – Cela peut être automatisé – mais très étroitement couplé au server de database. Oracle dbca a des lignes de command. Si c'est pour une sorte de deployment interne, par exemple des tests, dans ce cas, l'utilisation d'un schéma différent suffira, ce qui peut être géré via jdbc.