Je ne sais pas si "variadic" est réellement le bon mot, mais je parle de choses qui peuvent prendre une liste de valeurs, comme IN()
. Si vous avez travaillé avec DBI depuis longtemps, vous avez probablement essayé de le faire:Comment puis-je utiliser des espaces réservés pour des fonctions SQL variées avec DBI de Perl?
(Note: Tous les exemples extrêmement simplifiées par souci de concision)
my $vals = join ', ', @numbers;
my $sth = $dbh->prepare("SELECT * FROM mytbl WHERE foo IN(?)");
$sth->execute($vals); # doesn't work
espaces réservés DBI simplement ne prennent pas en charge ces types des manigances, c'est une valeur unique pour chaque ?
ou rien, pour autant que je sache.
Cela me conduit à finir par faire quelque chose comme:
my $sth = $dbh->prepare("SELECT * FROM mytbl WHERE foo IN ($vals)");
qui n'est pas si horrible, mais considérer une fonction, comme je l'ai écrit aujourd'hui un, qui doit accepter une SQL arbitraire avec IN
clause et une liste de valeurs
sub example {
my $self = shift;
my ($sql, @args) = @_;
my $vals = join ', ', @args;
$sql =~ s/XXX/$vals/; <---- # AARRRGHGH
my $sth = $self->dbh->prepare($sql);
...
}
Cela finit par obtenir appelé par la substance qui ressemble à
my $sql = "SELECT * FROM mytbl WHERE foo IN(XXX) AND bar = 42 ORDER BY baz";
my $result = $self->example($sql, @quux);
Cela choque vraiment mon sens de l'esthétique. Construire SQL personnalisé par programme est une assez grande douleur comme c'est; Je ne veux pas aller dans le sens de regexing mes chaînes SQL si je n'ai pas à le faire.
Y a-t-il un meilleur moyen?
J'aime l'idée de 'sprintf'; Je suis étonné de ne pas y penser car je travaillais dessus – friedo
J'ai toujours pensé que 'sprintf' n'était pas très perlish, mais il y a certainement des avantages dans les substitutions compliquées (par exemple ma déclaration de concat dans les commentaires ci-dessous est en écriture seule). :) – Ether
Perlish = faire le travail facilement. sprintf est souvent un moyen facile de faire le travail, ergo ... :) –