regexp_replace multiple examples characters postgresql embedded-database database-driven

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.



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 .