¿Hay alguna ventaja de usar un generador de consultas, en lugar de usar SQL sin formato?
P.ej
$q->select('*')
->from('posts')
->innerJoin('terms', 'post_id')
->where(...)
vs:
SELECT * FROM posts WHERE ...
Veo que muchos marcos usan este tipo de capas de abstracción, pero no entiendo los beneficios.
php
sql
frameworks
Anna K.
fuente
fuente
Respuestas:
La abstracción de escribir el SQL a través de un marco bien, los resúmenes.
Escribir SQL a mano no es tan malo en sí mismo, pero comienza a tener problemas para escapar y desinfectar, y esto se convierte en un desastre. Una capa de abstracción puede encargarse de todo esto detrás de escena, permitiendo que su código esté limpio y libre de muchas
mysql_real_escape_string()
llamadas o similares.Además, esto brinda la posibilidad de contabilizar diferentes dialectos de SQL. No todas las bases de datos están construidas de la misma manera y puede haber variaciones en las palabras clave o la sintaxis de una determinada funcionalidad. El uso de una capa de abstracción brinda la capacidad de generar la sintaxis correcta para su variante dinámicamente.
Si bien una capa de abstracción puede introducir un impacto en el rendimiento, generalmente es insignificante en comparación con la limpieza y la solidez del código que recibe a cambio.
fuente
Los creadores de consultas son mi odio favorito, ¡tanto que escribí mi propio Framework (Apeel) para evitar usarlos!
Si usa PDO (lo que definitivamente recomiendo que haga), entonces la santificación de la entrada se maneja por usted.
Como alguien más dijo, aunque facilitan el cambio entre bases de datos, tienden a admitir la funcionalidad del "mínimo común denominador" y no admitirán o tendrán un rendimiento más bajo para funciones más avanzadas.
He estado desarrollando sistemas con bases de datos desde alrededor de 1986 y en todo ese tiempo rara vez me he encontrado con una compañía que realmente esté cambiando la base de datos que usan, aparte de cuando necesitaban un mejor rendimiento. Si está cambiando las bases de datos para obtener un mejor rendimiento, entonces tiene mucho más sentido dedicar su tiempo a optimizar sus consultas a mano para aprovechar al máximo la nueva base de datos en lugar de aprovechar el éxito de un generador de consultas por simplicidad.
El tiempo dedicado a familiarizarse con las qwirks de un generador de consultas (luego volver a aprender cuando se cambia a uno mejor) sería mucho más productivo dedicado a aprender cómo optimizar su SQL.
De todos modos, es por eso que NO usar uno, aunque algunas personas los aman.
fuente
Teóricamente? Si. Glenn Nelson señaló cómo a menudo te ayudarán. (Si es un buen generador de consultas).
¿En la práctica? No siempre cumple con la teoría y en realidad podría causar problemas. Suponga que está utilizando un generador de consultas contra algunos DBMS populares y que todo es color de rosa. Luego, un cliente le pide que acceda a su DBMS que tiene algunas peculiaridades que su generador de consultas elegido simplemente no puede manejar. (Llegué a este problema cuando tuve que trabajar con una versión anterior de Pervasive).
¡PERO! Lo que debe hacer es separar la capa de acceso a datos y asegurarse de que puede intercambiar una nueva si es necesario. De esa manera, puede crear ese generador de consultas genial con todas las características, pero si necesita conectar uno nuevo que use ese extraño pseudo-sql para la base de datos en cuestión.
fuente
Creo que el beneficio práctico del día a día del generador de consultas es la reutilización del código y la capacidad de seguir el principio DRY.
Con el generador de consultas puede poner partes repetidas de SQL en métodos. Y luego use estos métodos para componer SQL complejo. Un ejemplo sería, por ejemplo, la cláusula JOIN reutilizable:
Entonces el uso sería:
Como puede observar, con el generador de consultas puede agregar partes de SQL en cualquier orden (p. Ej., UNIRSE a la parte después de WHERE one) en contraste con el caso cuando reúne cadenas SQL manualmente. Además, puede leer sobre el patrón del generador para ver su intención y sus beneficios.
Estoy de acuerdo con respecto a escapar y desinfectar, pero esto también podría lograrse sin el generador de consultas. Con respecto a la abstracción de tipo / dialecto de DB: este es un beneficio bastante teórico y cuestionable, casi nunca utilizado en la práctica.
fuente
Proporcionaré una respuesta basada en el archivo Léame de un generador de SQL personalizado mío ( Dialecto )
(sigue el texto sin formato, se eliminaron las referencias específicas de la biblioteca)
Requisitos
Caracteristicas
Creo que las características y requisitos anteriores esbozan las razones por las que uno usaría un generador de abstracción SQL
La mayoría de las características anteriores son compatibles con la mayoría de los constructores de SQL (aunque no creo que todos los listados sean compatibles, que yo sepa)
Ejemplos de casos de uso:
Finalmente, un ejemplo de un caso de uso que tuve. Estaba creando una aplicación en la que el esquema de base de datos subyacente (wordpress) no era adecuado para el tipo de consultas de datos que debían realizarse, además de que algunas de las tablas de WP (por ejemplo, publicaciones) tenían que usarse (por lo tanto, tener tablas completamente nuevas para todos los datos de la aplicación no era una opción).
En ese caso, poder hacer una aplicación similar a MVC donde el modelo podría ser consultado por condiciones personalizadas / dinámicas hizo que la codificación de consultas fuera casi una pesadilla. Imagina tener que admitir consultas de hasta 2-3 tablas con combinaciones y filtrar las condiciones para ver qué tabla unir con qué y también cuidar los alias necesarios, etc.
Es evidente que se trataba de un caso de uso abstracción de consulta y, aún más, que necesitaba (o al menos en gran medida benefició de) que tiene una capacidad de definir vistas personalizadas suaves (un conglomerado de tablas unidas como si fueran una tabla personalizada adecuada para el modelo) . Entonces fue mucho más fácil, más limpio, modular y flexible. En otro aspecto, la aplicación (código) también usó la capa de abstracción de consulta como una herramienta de normalización (esquema db) . Como algunos dicen, era a prueba de futuro .
Si mañana las personas deciden que necesitan algunas opciones o datos adicionales, es muy fácil agregarlos al modelo en un par de líneas y funcionar bien. Además, si mañana las personas deciden que ya no quieren usar wordpress (ya que la aplicación está acoplada libremente a wordpress como complemento), también es relativamente fácil cambiar ( solo la definición de) los modelos en un par de líneas de código para adaptarse al nuevo esquema.
¿Ves lo que quiero decir?
fuente
Muy a menudo, algunos de los argumentos para estas consultas son, en efecto, algunos valores en lugar de constantes. Ahora, muchos de ellos se han derivado esencialmente de publicaciones de formularios de usuario. Y, por lo tanto, hay muchas posibilidades de ataques de inyección SQL. Entonces, inherentemente, la formación de consultas requiere una validación completa.
Ahora, esto no quiere decir que no confiamos en el desarrollador, pero la formación de la consulta puede ser fácil, pero repetir todas las posibles comprobaciones de validación en todas partes puede implicar que a veces puede fallar de forma incidental o modificar la consulta, pero no modifique la consulta, pero no Actualice la verificación de validación. Algunos novatos incluso podrían conocer todos los peligros de perderse esto. Por lo tanto, la abstracción del generador de consultas es bastante esencial.
fuente
Solía pensar que los creadores de consultas eran aplicaciones GUI que le permitían seleccionar tablas y unir gráficamente mientras generaba SQL, pero ahora entiendo que también llama a los creadores de consultas las API que proporcionan una forma de no tener que crear consultas SQL puras , abstrayéndose de posibles diferencias en los sabores de SQL.
Usar tales constructores de consultas es bueno , pero tiendo a pensar que las personas que dependen en gran medida de ellos tienden a no preguntar a los DBA: "oye, esta es una consulta que uso mucho, cree una vista desde ella".
No me malinterpretes.
Creo que deberías escribir consultas en vistas y no en tablas. No por seguridad o filtrado, que son buenas razones, sino por la misma razón que debe codificar contra interfaces y no contra clases concretas: desacoplamiento. Las vistas son como "contratos", de la misma manera que las interfaces son "contratos" en OOP. Puede cambiar las tablas subyacentes, pero siempre y cuando obligue a las vistas a mostrar el mismo "contrato" a los programadores, el código no debe romperse.
Una vez más, no me malinterpretes, puedes usar constructores de consultas para consultar vistas, pero muchas vistas llegan a existir como un proceso de maduración que es el producto de tener que escribir consultas y preguntarle a tu DBA: "hombre, crea esto, por favor" .
¿Me equivoco al pensar que al no escribir consultas no puede detectar la necesidad de crear ciertas vistas?
Otra cosa que me preocupa es que los programadores novatos no dominen SQL, una de las piezas de tecnología más hermosas creadas por el hombre, al no tener que hacerlo.
fuente