IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SGBD Perl Discussion :

[Object] Héritage de DBI


Sujet :

SGBD Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Par défaut [Object] Héritage de DBI
    Bonjour,

    Je voudrais me faire une petite classe perso, qui me permettrait d'exécuter certaines requêtes sur ma base de données MySQL. Je ne sais pas si hériter de DBI est possible.

    J’ai lu quelques articles sur la notion d'objet en Perl (je commence tout juste le Perl), et j'avoue que j'ai un peu l'impression que c'est du bidouillage pour ressembler a de l'objet. Bref ... j'ai un peu de mal a cerner la chose.

    J’ai lu ce document et également le tuto de développer, mais il y a encore beaucoup de chose que je ne comprends pas. Petit exemple, j'avais commencé à faire quelque chose et puis j'ai arrêté car j'avais l'impression de redéfinir les méthodes de DBI.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #!/usr/bin/perl -w
     
    ######### Libraries that we need ############
    use lib "/export/home/glasap/bin/perl/lib";
    use strict;
    use DBI();
    #############################################
     
    # constructor
    sub new 
            {
            my ($classe, $host, $login, $passwd, $bdd) = @_;
            my $this = {"host" => $host,"login" => $login, "passwd" => $passwd, "bdd" => $bdd};
            bless ($this,$classe); 
            return $this; 
            }
     
    # Destructor
    sub DESTROY
            {
            print "Destruction de l'objet";
            }
     
    # database connection
    sub connect
            {
            my ($this, $cnx) = @_;
            $cnx = DBI->connect("DBI:mysql:database=".$this->{bdd}.";host=".$this->{host}.", ".$this->{login}.", ".$this->{passwd}.", {'RaiseError' => 1}") || die("Bad connection");
            bless($this,$cnx);
            }
     
    # Database deconnection
    sud deconnect
            {
            my ($dbh);
            $dbh->disconnect;
            }
     
    # Query execution
    sub exec
            {
            my ($this, $sth, $sql) = @_;
            $sth=$dbh->prepare($sql);
            $sth->execute();
            }
    Merci de me donner un petit coup de pouce ...

  2. #2
    Membre éclairé Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Par défaut
    Quand tu fait un use DBI(); tu hérite pas de DBI tu inclue juste la lib.
    Pour dériver d'une lib il faut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    use LALIB;
     
    our @ISA = qw(LALIB);
     
    sub new {
      my $class = shift;
      my %cnf = @_;
     
      # on dérive
      my $self = $class->SUPER::contructeur_LIB();
     
      # tu ajoute les champs que tu veux a $self->{}
      # .....
      bless($self,$class);
      return $self;
    }
     
     
    et pour être propre ajouter un destructeur
     
    sub DESTROY
    {
      my $self = shift;
      eval {
         $self->SUPER::DESTROY();
      };
    }

    sinon pour ta classe je ferai cela


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #!/usr/bin/perl -w
     
    ######### Libraries that we need ############
    use lib "/export/home/glasap/bin/perl/lib";
    use strict;
    use DBI();
    #############################################
     
    # constructor
    sub new 
    {
       my $class = shift;
       my %cnf  = @_: 
       return bless \%cnf, $class;
    }
     
     
    # database connection
    sub connect
    {
      my $self = shift;
      $self->{'cnx'} = undef; # On met le handler de connexion dans l'objet (pas obligatoire biensur :p)
     
      # Création du DSN
      my $DSN = "DBI:mysql:database=$self->{bdd};host=$self->{host}"; 
      while (! defined $self->{'cnx'} ) {
        print "Connexion a la base de données\n";
        $self->{'cnx'} = DBI->connect($DSN,$self->{'login'},$self->{'passwd'},{'RaiseError' => 1});
      }
    }
     
     
     
    # Database deconnection
    sub deconnect
    {
      my $self = shift;
      $self->{'cnx'}->disconnect;
    }
     
     
     
    # Query execution
    sub exec
    {
      my $self = shift;
      my $req  = shift;
      my @args = @_; # Contient les eventuels arguments a passé
     
      # Préparation de la requete
      my $this = $self->{'cnx'}->prepare($req);
     
      # scalar() renvoie le nombre d'éléments du tableau
      if ( scalar @args > 0 ) {
        $this->execute(@args);
      } else {
        $this->execute();
      }   
    }

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    L'objet en Perl est effectivement un rajout tardif, en tant que tel sa syntaxe et sa sémantique peuvent faire un peu "gadget"... Néanmoins on peut faire de l'objet efficace et propre en Perl.
    Pour créer une nouvelle hiérarchie d'objet, je conseillerais d'utiliser l'un des Kit de conception objet. Par exemple Class::Std est puissant, classique et efficace, Moose est plus innovant et se calque sur le modèle objet de Perl 6, qui est très intéressant.

    Ton code est bourré d'erreurs, j'ai l'impression que tu ne sais pas vraiment ce que tu fais : tu as des $dbh qui viennent de nulle part, tu crées et stocke des connexions mais sans les utiliser...

    Avec Moose par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    package MaPtitBDD;
     
    use lib "/export/home/glasap/bin/perl/lib";
    use DBI();
     
    use Moose;
     
    has 'login' => (is => 'ro');
    has 'passwd' => (is => 'ro');
    has 'bdd' => (is => 'ro');
    has 'host' => (is => 'ro');
    has 'cnx' => (
      is => 'rw',
      isa => 'DBI::db',
      lazy => 1,
      default => sub { 
          my $self = shift;
          my $DSN = "dbi:mysql:database=".$self->bdd.";host=".$self->host; 
          DBI->connect($DSN, $self->login , $self->passwd, {'RaiseError' => 1});
      }
    );
     
    # database connection
    sub connect
    {
      my $self = shift;
     
      # Création du DSN
      my $DSN = "dbi:mysql:database=".$self->bdd.";host=".$self->host; 
      $self->cnx( DBI->connect($DSN, $self->login , $self->passwd, {'RaiseError' => 1}) );
    }
     
     
     
    # Database deconnection
    sub deconnect
    {
      my $self = shift;
      $self->cnx->disconnect;
    }
     
     
     
    # Query execution
    sub exec
    {
      my $self = shift;
      my $req  = shift;
      my @args = @_; # Contient les eventuels arguments à passer
     
      # Préparation de la requete
      my $sth = $self->cnx->prepare($req);
     
      $sth->execute(@args); 
    }
     
    __END__
    --
    Jedaï

  4. #4
    Membre éclairé Avatar de scaleo
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 327
    Par défaut
    Très interessant ce module Moose est très interessant , je met ton cde dans mes snippets jedai

Discussions similaires

  1. Réponses: 30
    Dernier message: 30/06/2009, 13h04
  2. héritage de "object"
    Par menuge dans le forum Général Python
    Réponses: 7
    Dernier message: 27/03/2009, 11h51
  3. Balise OBJECT et héritage (css/javascript)
    Par Dionyzos dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 01/04/2007, 11h08
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo