Pregunta

He estado escribiendo una aplicación Java en mi máquina y funciona perfectamente usando el DB que configuré, pero cuando lo instalo en el sitio explota porque el DB es ligeramente diferente.

Así que estoy en el proceso de escribir un código para verificar que:

  • A: Tengo los detalles de la base de datos correctos

  • B: La base de datos tiene todas las Tablas que espero y tienen las columnas correctas.

Tengo A abajo pero no tengo idea de por dónde empezar con B, ¿alguna sugerencia?

Target DB es para el cliente actual es Oracle, pero la aplicación también se puede configurar para ejecutarse en SQL Server. Por lo tanto, se agradecería una solución genérica, pero no es necesaria ya que estoy seguro de que puedo descubrir cómo hacer una de la otra.

¿Fue útil?

Solución

Querrá consultar el esquema de información de la base de datos, aquí hay algunos ejemplos para Oracle, cada plataforma que conozco tiene algo similar.

http://www.alberton.info/oracle_meta_info.html

Otros consejos

Es posible que pueda utilizar una herramienta de migración de base de datos como LiquiBase para esto; la mayoría de estas herramientas tienen alguna forma de verificar la base de datos. No tengo experiencia de primera mano al usarlo, así que es una suposición.

Utilizo DbUnit para probar bases de datos. Es una solución basada en Java, que se integra bien con Junit . Es posible usarlo casi sin Java. No lo he usado exactamente en la misma situación que usted describió, pero debería estar lo suficientemente cerca como para funcionar.

La solución más genérica sería ejecutar consultas con una cláusula select que tenga los coulmns esperados y una cláusula que tenga nombres de tabla, dentro del bloque try catch. Puede poner la cláusula where como 1 = 2 para no recuperar ningún dato. Si la consulta se ejecuta sin generar una excepción, obtendrá la tabla y las columnas esperadas.

La pieza ligeramente diferente podría manejarse mejor al crear scripts para la creación de la base de datos en primer lugar. Un proceso automatizado le brinda una mejor oportunidad de hacer que los dos sean idénticos.

Otro punto que vale la pena destacar es que minimiza su riesgo al hacer que sus entornos de desarrollo y producción sean idénticos: el mismo esquema de base de datos y proveedor para ambos. Cambia las circunstancias que hacen que los dos sean diferentes.

Por último, no dices qué es " ligeramente " diferentes, pero a veces son inevitables (por ejemplo, Oracle usa secuencias, SQL Server usa identidades). Tal vez Hibernate puede ayudarlo a cambiar entre proveedores de manera más confiable. Resume los detalles de tal manera que cambiar las bases de datos puede significar modificar un solo valor en un archivo de configuración.

Lo que necesita tener es básicamente pruebas unitarias para su base de datos. " Debe existir una columna llamada FOOBAR, el tipo debe ser Integer. No pueden existir claves foráneas, etc. & Quot;

Esto es factible con JUnit y JDBC simples (pregunte en la tabla por sus metadatos) ya que puede asegurarse de estar absolutamente seguro de lo que se está haciendo, lo que puede ser más difícil cuando se usa dbUnit.

Puede verificar la presencia de tablas, columnas, vistas, etc. utilizando estas tablas en Oracle

USER_TABLES USER_VIEWS USER_PROCEDURE

(o para todo) USER_OBJECTS WHERE OBJECT_TYPE = '??'

Para continuar ... USER_TAB_COLS para columnas de tabla

Saludos K

Utilizo MigrateDB para esto. Le permite crear consultas que hacen cosas como verificar la existencia de tablas, columnas, filas, índices, etc. dados para una base de datos determinada y usarlos como & Quot; tests. & Quot; Si una prueba falla, desencadena una & Quot; acción & Quot; (que es solo otra consulta que sabe cómo solucionar el problema).

MigrateDB es compatible con múltiples plataformas de bases de datos (puede especificar & "; verificar la consulta de existencia de tabla &"; para cada plataforma, por ejemplo), pruebas completamente configurables (puede hacer las suyas propias), viene con pruebas de Oracle bastante completas, y se pueden ejecutar en " auditar solo " modo para que solo te diga cuáles son las diferencias.

Es una solución agradable y robusta.

Si está utilizando JDBC simple, debería intentar utilizar este método: DatabaseMetadata.getTables y otros métodos similares disponibles en la clase de metadatos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top