java - ¿Hay alguna forma para que DBUnit cree tablas automáticamente?
dataset create-table (5)
Acabo de darme cuenta de que DBUnit no crea tablas por sí mismo (consulte ¿Cómo realizo pruebas con DBUnit con JDBC y HSQLDB normales sin enfrentar una excepción NoSuchTableException? ).
¿Hay alguna forma para que DBUnit cree automáticamente tablas desde un conjunto de datos o dtd?
EDITAR: para realizar pruebas simples de una base de datos en memoria como HSQLDB, se puede usar un enfoque simple para crear tablas automáticamente:
private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException {
String[] tableNames = dataSet.getTableNames();
String sql = "";
for (String tableName : tableNames) {
ITable table = dataSet.getTable(tableName);
ITableMetaData metadata = table.getTableMetaData();
Column[] columns = metadata.getColumns();
sql += "create table " + tableName + "( ";
boolean first = true;
for (Column column : columns) {
if (!first) {
sql += ", ";
}
String columnName = column.getColumnName();
String type = resolveType((String) table.getValue(0, columnName));
sql += columnName + " " + type;
if (first) {
sql += " primary key";
first = false;
}
}
sql += "); ";
}
PreparedStatement pp = connection.prepareStatement(sql);
pp.executeUpdate();
}
private String resolveType(String str) {
try {
if (new Double(str).toString().equals(str)) {
return "double";
}
if (new Integer(str).toString().equals(str)) {
return "int";
}
} catch (Exception e) {}
return "varchar";
}
No. Tendrá que ejecutar un script SQL con las definiciones de tabla en.
Como publiqué en el otro hilo, el XML no contiene datos suficientes para crear una tabla. Supongo que podrías hacer algo aterrador como analizar los valores para intentar averiguar qué valores contiene, pero eso sería bastante frágil. Esto difiere de Hibernate en que las clases anotadas contienen mucha información sobre el aspecto de la base de datos. Parte en anotaciones y parte en los campos de tipos de Java.
Realmente no. Como señala la respuesta que vinculó, los archivos dbunit xml contienen datos, pero no tipos de columna.
Y realmente no quieres hacer esto; corre el riesgo de contaminar su base de datos con artefactos de prueba, lo que abre la posibilidad de que el código de producción se base accidentalmente en las tablas creadas por el proceso de prueba.
El hecho de hacer esto sugiere fuertemente que no tiene su proceso de creación y mantenimiento de la base de datos adecuadamente definido y programado.
Si está utilizando JPA, generalmente puede configurar su proveedor de JPA para que cree / actualice las tablas en la inicialización.
Por ejemplo, para hibernar, especifique la propiedad hibernate.hbm2ddl.auto y establezca su valor en create-drop (debería estar bien para la prueba).
Vea también: Documentación de Hibernate, Capítulo 3 Configuración
Sin embargo, asegúrese de que el proveedor de JPA sea el primero en acceder a la base de datos;)
Solo quería intervenir y decir que esto fue muy útil para mí. Necesitaba conectarme a una base de datos Oracle y exportarlo a un archivo XML, luego importarlo como una base de datos HSQL de prueba y acceder a él con Hibernate. Utilicé este código para crear las tablas antes de hacer
DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);.
Sin embargo, una advertencia, este código establece la primera columna de cada tabla como la clave principal, así que tenga cuidado si usa tablas de relaciones, ya que puede obtener una "violación de restricción de clave principal" en la importación. Gracias por el fragmento de código!
Spring Boot / Spring JDBC puede inicializar una base de datos con JDBC simple.
Spring JDBC tiene una característica de inicializador de DataSource. Spring Boot lo habilita de forma predeterminada y carga SQL desde las ubicaciones estándar
schema.sql
ydata.sql
(en la raíz de la ruta de clase). Además, Spring Boot cargará elschema-${platform}.sql
ydata-${platform}.sql
(si está presente), donde plataforma es el valor despring.datasource.platform
, por ejemplo, puede elegir establecerlo el nombre del proveedor de la base de datos (hsqldb, h2, oracle, mysql, postgresql, etc.).
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html