Je fais beaucoup de requêtes d'insertion, et je pense qu'il serait préférable d'écrire un sous-programme pour cela. Quelque chose comme insertRow($table, @stuff_to_insert)
. Mais comment puis-je rendre la sous-routine dynamique quand il s'agit de la @stuff_to_insert
, qui peut être quelque chose de 1-5 arguments?Comment écrire un sous-programme pour les insertions DBI avec un nombre variable de valeurs?
Répondre
Quelque chose comme:
sub insertRow
{
my $table = shift;
my $placeholders = join(',', map { "?"; } @_);
$dbh->do("INSERT INTO $table VALUES ($placeholders)", undef, @_);
}
Modifié: vous devez ajouter undef
comme paramètre. Leon Timmermans suggère de ne pas utiliser de prototypes
Passez simplement une référence à un tableau d'arguments. Ensuite, dans insertRow, parcourez ce tableau pour obtenir les arguments ...
La meilleure solution est probablement d'utiliser un système ORM tel que DBIx::Class. Ils rendent la manipulation de SQL beaucoup plus facile.
Si vous choisissez de rester sur DBI cru, je vous conseille d'utiliser des déclarations préparées comme ceci:
my $query = sprintf 'INSERT INTO %s VALUES(%s)', dbh->quote_identifier($table), join ',', ('?') x $columns;
my $sth = $dbh->prepare($query);
for my $row (@rows) {
$sth->execute(@{$row});
}
Ce sera un avantage de vitesse et de robustesse.
Vous pouvez tout emballer dans un sous-marin, mais un ORM offre probablement une meilleure solution de toute façon.
Y a-t-il une faute de frappe à la fin de sprintf ou est-ce juste un mini buggy d'opéra? –
Vous avez raison, c'est une faute de frappe. Je l'ai réparé. –
Je ne comprends pas complètement le code. Qu'est-ce que @ $? Et quelque chose manque-t-il à la fin de la requête? –
Le paramètre qui passe une partie est assez facile:
sub foo {
my $table = shift;
my @stuff_to_insert = @_;
# Do stuff here
}
Peu importe si vous passez un paramètre, ou cinq, ou cinquante, ils font tous dans @stuff_to_insert
.
Pour exécuter les requêtes réelles, suivez les conseils de Léon et utilisez les instructions préparées. (ORMs peuvent être maniables, mais, IMO, ils sont surestimés et sont sérieusement exagérés dans les cas simples.)
Downvote parce que votre prototype provoque le dysfonctionnement du code d'une horrible façon horrible. Vous ne devriez pas utiliser de prototypes quand vous ne savez pas exactement ce qu'ils font, et même eux, il n'y a absolument aucune raison d'utiliser le prototype que vous venez de suggérer. –
Mais sauf pour le prototype son bien? –
Quel est le problème? – kmkaplan