[caracas-pm] Usando funciones SQL multiparámetro desde DBIx::Class
Ernesto Hernández-Novich
emhnemhn at gmail.com
Tue Mar 29 06:10:58 PDT 2011
Si bien está documentado entre DBIx::Class::ResultSet y SQL::Abstract,
no hay ejemplos suficientes para las cosas complejas que uno tiene que
lograr cuando quiere utilizar funciones SQL como columnas o como
filtros. No me refiero a las estándar (SUM, AVG, MAX, MIN, etc.); me
refiero a funciones arbitrarias que uno escribe en manejadores de bases
de datos que ofrecen esa posibilidad, e incluso en presencia de
operadores binarios arbitrarios (por ejemplo, el >> que pongo más
abajo).
El problema era expresar
select ... foo(a,bar(b,c)) as foo ...
(...)
where ... campo >> baz(d,e) ...
considerando que los puntos suspensivos corresponden a otras columnas de
interés o filtros, y que a, b, c, d y e son parámetros de la búsqueda,
mientras que campo siempre es la misma columna. Esto es, quiero que las
posiciones de a, b, c, d y e sean placeholders, en caso contrario el
desempeño de la base de datos no va a ser bueno.
Terminé escribiendo
...->search( {
'campo' => {
'>>=' => \[
"baz(?,?)",
[ 1 => $d ],
[ 2 => $e ]
]
},
{
'+select' => [
\[ "foo(?,bar(?,?))",
[ 1 => $a ],
[ 2 => $b ],
[ 3 => $c ]
]
],
'+as' => [ qw/foo/ ]
}
);
Y al mirar la consulta generada usando DBIC_TRACE, la forma es
exactamente la que quiero, excepto que no se va a incluir el 'as foo',
sin embargo el ResultSet tiene la columna virtual 'foo' que debe ser
consultada vía get_column().
--
Ernesto Hernández-Novich - @iamemhn - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't aptitude it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
More information about the caracas-pm
mailing list