multiple - postgresql select regexp_replace
incrustado PostgreSql (5)
¿Hay un PostgreSql incrustado para que podamos probar nuestra aplicación basada en PostgreSql?
Como PostgreSql tiene algunos dialectos, es mejor usar PostgreSql incorporado que otras bases de datos integradas.
El es un servidor PostgresSQL "incrustado" que ha sido diseñado para pruebas unitarias desde Java:
https://github.com/yandex-qatools/postgresql-embedded
Embedded postgresql proporcionará una plataforma neutral para ejecutar postgres binarios en pruebas unitarias . Gran parte del código se ha elaborado a partir del proceso de inserción de Flapdoodle OSS
Por otro lado, también existen proyectos similares para Mongo , Redis , Memcached y nodejs .
No, no hay PostgreSQL incorporado, en el sentido de una base de datos cargable en proceso como una biblioteca. PostgreSQL está orientado al proceso; cada backend tiene un hilo, y genera múltiples procesos para hacer el trabajo. No tiene sentido como una biblioteca.
La base de datos H2 admite un subconjunto limitado del dialecto SQL PostgreSQL y el uso del controlador PgJDBC.
Lo que puede hacer es initdb
una nueva base de datos temporal , iniciarla con pg_ctl
en un puerto aleatorizado para que no entre en conflicto con otras instancias, ejecutar sus pruebas, luego usar pg_ctl
para detenerlo y finalmente eliminar la base de datos temporal.
Recomiendo encarecidamente que ejecute el postgres temporal en un puerto no predeterminado para que no se arriesgue a colisionar con ningún PostgreSQL instalado localmente en el equipo que ejecuta las pruebas.
(Hay "PostgreSQL incorporado en el sentido de ecpg , esencialmente un cliente PostgreSQL incrustado en código fuente C como extensiones de lenguaje C basadas en preprocesador. Todavía requiere un servidor en ejecución y es un poco desagradable de usar, no muy recomendado. hacer que portar desde varias otras bases de datos sea más fácil).
Probé el proyecto sugerido por @btiernay (yandex-qatools). Pasé unos días con esto y sin ningún tipo de ofensa es una solución sobre ingeniería que no funciona en mi caso, ya que quería descargar los archivos binarios del repositorio interno en lugar de ir a Internet pública. En teoría, lo admite, pero de hecho no es así.
Componente PostgreSQL incrustado de OpenTable
Terminé usando github.com/opentable/otj-pg-embedded y funciona como un encanto. Se mencionó en los comentarios, así que pensé en mencionarlo aquí también.
Lo usé como base de datos independiente y no como regla para pruebas unitarias y desarrollo local.
Dependencia:
<dependency>
<groupId>com.opentable.components</groupId>
<artifactId>otj-pg-embedded</artifactId>
<version>0.7.1</version>
</dependency>
Código:
@Bean
public DataSource dataSource(PgBinaryResolver pgBinaryResolver) throws IOException {
EmbeddedPostgres pg = EmbeddedPostgres.builder()
.setPgBinaryResolver(pgBinaryResolver)
.start();
// It doesn''t not matter which databse it will be after all. We just use the default.
return pg.getPostgresDatabase();
}
@Bean
public PgBinaryResolver nexusPgBinaryResolver() {
return (system, machineHardware) -> {
String url = getArtifactUrl(postgrePackage, system + SEPARATOR + machineHardware);
log.info("Will download embedded Postgre package from: {}", url);
return new URL(url).openConnection().getInputStream();
};
}
private static String getArtifactUrl(PostgrePackage postgrePackage, String classifier) {
// Your internal repo URL logic
}
Puede usar una instancia de container de PostgreSQL.
Dado que girar un contenedor es una cuestión de segundos, esto debería ser lo suficientemente bueno para pruebas unitarias. Además, en caso de que necesite conservar los datos, p. Ej. Para su investigación, no necesita guardar todo el contenedor, solo los archivos de datos, que pueden mapearse fuera del contenedor.
Uno de los ejemplos de cómo hacer esto se puede encontrar here .
Si está buscando ejecutar una versión en proceso de postgres desde un paquete de prueba de integración (o similar), el https://github.com/yandex-qatools/postgresql-embedded funcionó bien para mí.
Escribí un pequeño plugin maven que se puede usar como envoltorio de maven alrededor de una versión bifurcada de postgresql-embedded.