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.)
- 1. Comment gérez-vous les insertions de section avec un NSFetchedResultsController?
- 2. Construire des objets avec un nombre variable de membres?
- 3. Écrire un nombre avec deux décimales SQL server
- 4. Comment gérez-vous un nombre variable de routes MVC?
- 5. Comment optimiser une table pour les insertions rapides seulement?
- 6. Comment écrire un plugin firefox pour un script cgi existant?
- 7. Générer un nombre de plages pour un ensemble aléatoire de valeurs
- 8. Comment comparer les valeurs dans un tableau
- 9. Passage variable Nombre d'arguments
- 10. Comment détecter si un nombre donné est un nombre entier?
- 11. Enregistrer un message avec un nombre variable d'arguments de type printf
- 12. Comment écrire un générateur de code avec un IDL personnalisé?
- 13. Table ASP.NET avec nombre variable de colonnes
- 14. Comment comparer les valeurs de deux contrôles avec un déclencheur?
- 15. Comment écrire un code JavaScript pour interagir avec Flash
- 16. Comment écrire un flux RSS avec Java?
- 17. Comment écrire un compteur d'accès efficace pour les sites Web
- 18. Comment puis-je extraire un nombre variable de groupes de chiffres à partir d'une chaîne Perl?
- 19. comment reformater un nombre avec des virgules
- 20. Comment écrire un plug-in pour IE
- 21. Comment temporiser un "sélectionner pour la mise à jour" dans Oracle en utilisant Perl DBI
- 22. Django: Faire un modèle avec un nombre indéfini de champs
- 23. Comment écrire un nouveau pilote Linux pour un périphérique i2c?
- 24. Comment conserver les insertions de colonnes datetime2 uniques?
- 25. Écrire un plugin ActiveRecord pour Rails
- 26. ColumnChart avec un nombre dynamique de colonnes
- 27. Comment formater un nombre avec des virgules?
- 28. Comment utiliser une expression régulière pour faire correspondre un nombre de longueur variable avec des tirets au milieu?
- 29. nombre variable d'arguments dans ParamArray argList()
- 30. Comment écrire un hook de sauvegarde global pour Emacs?
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