Vous n'êtes pas identifié(e).

#1 20/04/2011 10:48:27

ZouZou
Membre

Envoyé default et non "default" a postgresql

Bonjour,

Je reviens vous voir avec nouveau défis:).

J’ai un script en perl qui lis un fichier ligne par ligne, vérifie la validité de informations contenue dans la ligne et les ajoutes dans ma base.

Une partie de mon script a pour but d’affecter dans ma base la valeur par défaut indiquer dans ma base, si l’élément est manquant. J’affecte donc à ma variable « default ».

Mon problème arrive au moment d’exécuté ma requête. J’obtiens le message d’erreur : «ERROR:  value for domain situation_recherche violates check constraint ».
Si j’ai bien compris le problème  lors de mon insert into, default est lu comme ça :
« Insert into table_exemple (v1,v2,v3) values(‘toto’,’default’,’12 ans’ );»,

Je souhaiterais savoir s’il est possible de faire comprendre à la base de donnée que la requête doit ce lire comme ça: « Insert into table_exemple (v1,v2,v3) values(‘toto’,default,’12 ans’ );».
Ou dois-je commencer à chercher une autre solution ? ^^

Cordialement ZouZou

Hors ligne

#2 20/04/2011 10:51:04

Marc Cousin
Membre

Re : Envoyé default et non "default" a postgresql

sans le bout de code, difficile de savoir ce qui se passe réellement. Mais oui, vous devez envoyer default sans quotes autour.


Marc.

Hors ligne

#3 20/04/2011 11:02:29

ZouZou
Membre

Re : Envoyé default et non "default" a postgresql

Bonjour Marc,

merci de votre intervention rapide.
je vous montre les parties de mon code qui effectue ce traitement.

voici l'affectation de default a ma variable :

 
sub par_default{
	my $valeur=$_[0];
	if ($valeur eq "" or $valeur == 0){
		my $valeur="default";
		return $valeur;
	}
	else {
		return $valeur;
	}
}

extrait du script  qui insére dans la base de donnée:

 		
                        while ($ligne=<NEW_DONNE>){
			chomp($ligne);
			my ($module,$elem,@rest)= split /;/,$ligne;
			if ($module eq "" or $elem eq""){
				print "Les informations sont manquante \npas d'insertion dans la base pour la ligne $ligne \n";
			}
			else {
				my $req1="select nom_module from description_module where nom_module=?";
				my $modul_existe=$db->prepare($req1);
				$modul_existe->execute($module);
				my $test=$modul_existe->rows;
				if ($test == 0){
					print "$module n'existe pas \n";
					#on crée
					if ( $elem =~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/){
						if (&adresse_valide($elem)){

							my ($surv,$freq_ex,$periode,$freq_attente)= @rest;
							$surv = &par_default($surv);
							$freq_ex = &par_default($freq_ex);
							$periode = &par_default($periode);
							$freq_attente = &par_default($freq_attente);

                                                        my $req_add_module="insert into description_module (nom_module, surveillance_recherche, requence_d_execution_du_module, Periode_d_attente_entre_deux_executions, Frequence_d_interogation_du_module, Adresse_ip) VALUES (?,?,?,?,?,?)";
                                                        my $add_module=$db->prepare($req_add_module);
                                                        print "$module,$surv,$freq_ex,$periode,$freq_attente,$elem\n";
                                                       $add_module->execute($module,$surv,$freq_ex,$periode,$freq_attente,$elem);


							$add_module->finish();
						}
						else{

							print "adresse non valide, l'ajout dans la base impossible \nVeuiller indiquer une adresse conforme pour la ligne $ligne \n";
						}
					}

voila j'espère que vous comprendrez ce que je veux faire ^^

Dernière modification par ZouZou (20/04/2011 11:06:40)

Hors ligne

#4 20/04/2011 11:32:09

Marc Cousin
Membre

Re : Envoyé default et non "default" a postgresql

C'est un peu tordu: DBI n'implémente pas cette notion de DEFAULT pour le moment. Par contre le DBD (le driver) postgres le fait, au moyen d'un symbole, qui n'est pas exporté par défaut. Voici un petit exemple qui crée un enregistrement dans une table avec sa valeur par défaut, au moyen d'une requête préparée:


use DBI;
use DBD::Pg qw($DBDPG_DEFAULT);
my $dbh=DBI->connect("dbi:Pg:dbname=marc");
my $sth=$dbh->prepare("INSERT INTO test VALUES(?)");
$sth->execute($DBDPG_DEFAULT);

Le 'truc', c'est de récupérer «$DBDPG_DEFAULT» de DBD::Pg. Après, on peut l'utiliser comme constante dans le code. C'est une référence d'objet, pas un scalaire, ce qui fait que DBD::Pg, quand il le voit, est capable de savoir qu'on a réellement un DEFAULT à cet endroit. C'est un peu sale, mais tant que ce n'est pas quelque chose qui existe au niveau de la couche DBI, il y a recours à ce genre de bidouille :(

Dernière modification par Marc Cousin (20/04/2011 11:32:37)


Marc.

Hors ligne

#5 20/04/2011 11:36:52

ZouZou
Membre

Re : Envoyé default et non "default" a postgresql

ha d'accord ! j'imaginais pas ça comme ça smile

je vous remercie Marc, je vais essayé de faire une bidouille dans le genre smile je vous tiendrais au courant si j'ai réussie

merci beaucoup

Hors ligne

#6 20/04/2011 11:41:33

ZouZou
Membre

Re : Envoyé default et non "default" a postgresql

ça marche !!  je crois que j'ai trouvé mon Dieu sur terre big_smile lol merci !!!

cordialement ZouZou

Hors ligne

Pied de page des forums