Bounty update: Mark recibió una muy buena respuesta. Adaptado: = en: a continuación. Sin embargo, todavía estoy buscando esquemas similares además de DBIx. Solo estoy interesado en ser compatible con cualquier cosa.Marcadores de posición ampliados para SQL, p. Ej. DONDE id IN (??)
Necesito asesorar sobre la sintaxis que he elegido para los marcadores de posición "extendidos" en las sentencias de SQL parametrizadas. Debido a que construir algunos constructos (cláusulas IN) me estaba molestando, decidí usar algunos atajos de sintaxis que se expanden automáticamente a ordinarios. marcadores de posición.
Me gustan. Pero quiero empaquetarlo para distribución, y me pregunto si es fácil de entender.
Básicamente mis nuevos marcadores de posición son ??
y :?
(params enumerados) y :&
y :,
y :|
y ::
(para los marcadores de posición con nombre) con la siguientes casos de uso:
-> db(" SELECT * FROM all WHERE id IN (??) ", [$a, $b, $c, $d, $e])
El ??
se expande en ?,?,?,?,?,...
dependiendo del número de $ args a mi funcion db() Este es bastante claro, y su sintaxis ya está estandarizada. Perls DBIx :: Simple también lo usa. Así que estoy bastante seguro de que esta es una idea aceptable.
-> db(" SELECT :? FROM any WHERE id>0 ", ["title", "frog", "id"]);
// Note: not actually parameterized attr, needs cleanup regex
Admitir it. Solo me gustó el emoticón. Básicamente, este marcador de posición :?
expande un $ args asociativo en nombres de columna simple. Se descarta cualquier valor de $ args de hecho. En realidad, es útil para INSERT junto con las cláusulas IN y, a veces, para IN. Pero aquí ya me pregunto si esta nueva sintaxis es sensata, o no solo un nombre inapropiado porque mezcla: ¿y? caracteres. Pero de alguna manera parece coincidir bien con el esquema de sintaxis.
-> db(" UPDATE some SET :, WHERE :& AND (:|) ", $row, $keys, $or);
Aquí el mnemónico :,
se expande en una lista de name=:name
pares separados por ,
comas. Mientras que :&
es una columna =: lista de columnas unidas por AND
s. Para la paridad he agregado :|
. Sin embargo, el: & tiene otros casos de uso fuera de los comandos de ACTUALIZACIÓN.
Pero mi pregunta no es acerca de la utilidad, pero si:, y: & parecen ser recordables?
-> db(" SELECT * FROM all WHERE name IN (::) ", $assoc);
Después de algún pesar de que también se añaden ::
para interpolar una :named,:value,:list
muy parecido ??
expande a ?,?,?
. Casos de uso similares, y sensato de tener para la uniformidad.
De todos modos, ¿alguien más ha implementado un esquema como ese? Diferentes marcadores de posición? ¿O cuál recomendarías por simplicidad? Actualización: Sé que la interfaz PHP Oracle OCI también puede vincular parámetros de matriz, pero no usa marcadores de posición específicos para ella. Y estoy buscando sintaxis de marcador de posición comparables.
Creo que pensaste mucho en esto, pero ¿qué pasa con las cláusulas y subconsultas de 'GROUP BY',' HAVING' y 'ORDER BY'? ¿Qué pasa con el formato personalizado, como cuando necesita agrupar por fecha sin incluir la porción de tiempo? ¿Qué pasa con las funciones que necesitan configuración adicional, como COALESCE o cualquier cosa que use la cláusula OVER (suponiendo que sea compatible)? –
@OMG Nah, no pensé mucho en eso. Me he concentrado en mis casos de uso más frecuentes. Y SQL dinámico específico todavía necesita trabajo manual. Especialmente expresiones. Pero por ejemplo:? podría usarse para las cláusulas ORDER y GROUP BY. Y para algunos constructos ya tengo el soporte {TOKEN} (que en esencia es la concatenación de SQL de nuevo). – mario
@stereofrog: De hecho. Aunque el objetivo de backend es diferente y estaba más preocupado con tirar matrices en SQL. La metodología del marcador de posición es comparable. – mario