2009-11-25 3 views
1

J'ai besoin d'insérer des valeurs d'un hachage dans une base de données. Voici le modèle de code que je dois insérer des valeurs dans la colonne table1 clé et valeur:Comment insérer des valeurs d'un hachage dans une base de données en utilisant le module DBI de Perl?

use DBI; 
use strict; 

%hash; #assuming it already contains desired values 
my $dbh = DBI->connect(
     "dbi:Sybase:server=$Srv;database=$Db", 
     "$user", "$passwd" 
) or die sprintf 'could not connect to database %s', DBI->errstr; 
my $query= "Insert INTO table1(key, values) VALUES (?,?) "; 
my $sth = $dbh->prepare($query) 
    or die "could not prepare statement\n", $dbh->errstr; 
$sth-> execute or die "could not execute", $sth->errstr; 

Je sais comment insérer des valeurs à l'aide de tableau-à-dire utiliser execute_array(), mais ne savent pas comment insérer des valeurs présentes dans %hash dans le tableau1.

Des suggestions?

+1

Que signifie exactement '% hash' contient? –

+0

comment est-ce important? il est défini exactement comme un hachage doit être défini. – shubster

+1

La structure du hachage est une partie importante de la question. Vous avez déjà deux réponses différentes, venant de personnes qui ont compris la question différemment, parce que ce qui est à l'intérieur du hash n'est pas clair. –

Répondre

6

qui suit utilise la fonction execute_array comme mentionné dans votre question. Je l'ai testé.

my $dbh = DBI->connect("DBI:mysql:database=$DB;host=$host;port=$port", $user, $password); 

my %hash = (
      1 => 'A', 
      2 => 'B', 
      0 => 'C', 
      ); 

my @keys = keys %hash; 

my @values = values %hash; 

my $sth = $dbh->prepare("INSERT INTO table1(id, value) VALUES (?,?);"); 

$sth->execute_array({},\@keys, \@values); 

(Désolé, je n'ai pas une base de données Sybase pour travailler avec, ou je l'utiliser comme un exemple.)

0

vous pourriez peut-être essayer d'utiliser

for my $key (keys %hash) { 
    $sth->execute($key, $hash{$key}) or die $sth->errstr; 
} 

Est-ce que vous essayez d'atteindre?

Si je comprends bien manual (« Execute la déclaration préparée une fois pour chaque tuple de paramètres (groupe de valeurs) [...] par une référence passée ... »), il devrait également être possible de simplement

($tuples, $rows) = $sth->execute_array(\%hash) or die $sth->errstr; 
1

Voici un moyen la plupart du temps facile de construire la requête. Je vais typiquement faire quelque chose comme ça parce que je n'ai pas encore trouvé une autre solution de contournement.

use strict; 
use DBI; 

my $dbh = Custom::Module::Make::DBH->connect('$db'); 

my %hash = (
    apple => 'red', 
    grape => 'purple', 
    banana => 'yellow', 
); 

my $keystr = (join ",\n  ", (keys %hash)); 
my $valstr = join ', ', (split(/ /, "? " x (scalar(values %hash)))); 
my @values = values %hash; 

my $query = qq` 
    INSERT INTO table1 (
     $keystr 
    ) 
    VALUES (
     $valstr 
    ) 
`; 

my $sth = $dbh->prepare($query) 
    or die "Can't prepare insert: ".$dbh->errstr()."\n"; 

$sth->execute(@values) 
    or die "Can't execute insert: ".$dbh->errstr()."\n"; 

Mais il est possible que je ne comprenais pas aussi bien la question: P

+1

Le problème que je vois avec cette approche est que l'on pourrait tomber dans le piège de ne pas échapper correctement les paramètres. Je recommande toujours d'utiliser les espaces réservés! A part ça, bonne idée. – Simon

+0

Ah, merci de l'avoir signalé. Je viens de faire une mise à jour du code ci-dessus qui résout ce problème. Désolé d'avoir manqué ça. –

+0

désolé si c'est une question idiote mais Custom :: Module :: Make :: est censé être changé en fonction de l'emplacement de votre droite DBH? – ado

1

Essayez SQL::Abstract

use DBI; 
use SQL::Abstract; 
use strict; 

%hash; #assuming it already contains desired values 
my $dbh = DBI->connect(
     "dbi:Sybase:server=$Srv;database=$Db", 
     "$user", "$passwd" 
) or die sprintf 'could not connect to database %s', DBI->errstr; 

my ($query, @bind) = $sql->insert("tableName", \%hash); 
my $sth = $dbh->prepare($query) 
    or die "could not prepare statement\n", $dbh->errstr; 
$sth-> execute (@bind) or die "could not execute", $sth->errstr; 
Questions connexes