2017-10-21 41 views
1

J'ai le code suivant:Comment accéder aux données de la base de données en cas d'exception?

my $savepoint = $c->db->txn_scope_guard; 
return $self->render('subnet/create', error => [ create => [email protected] ], 
    servers => $self->rows('Server')->lookup, 
) unless $subnet = eval{ $self->rows('Subnet')->create($subnet) }; 
$savepoint->commit; 

Ici rows est aide Mojolicious qui donne accès aux données.

sub model { 
    my($c, $table_name) = (shift,shift); 

    return $c->db->resultset($table_name); 
} 

Et ->db est également aide:

sub db { return $schema 
    //= DBIx::Class::Schema->connect($DB->{ DSN }, @$DB{ qw/ USER PASS/}, { 
     AutoCommit => 1, 
     RaiseError => 1, 
     quote_char => '"', 
    }) 
}); 

Lorsque je crée $subnet et contrainte unique se produit (ici a quelle que soit la contrainte se produit, en fait en cas d'exception) j'ai eu l'erreur:

C'est quand je prends exception avec eval{ ... } la transaction en cours est interrompue et je ne peux pas faire $self->rows('Server')->lookup

Existe-t-il un moyen d'accéder aux données du serveur après exception se produire?

+0

Pourquoi ne faites-vous pas la recherche avant la création? – xxfelixxx

+0

parce que je n'ai pas besoin de rechercher des données lorsque l'utilisateur 'POST' sa sélection. Je n'ai besoin de rechercher que lors du rendu du formulaire 'subnet/create'. –

Répondre

0

Semble J'ai trouvé la réponse, parce que lire un message d'erreur plus attentivement:

... commands ignored until end of transaction block

donc je force la fin de bloc de transaction lorsque l'exception du produit:

$c->db->txn_rollback; 

Le code:

my $savepoint = $c->db->txn_scope_guard; 
unless($subnet = eval{ $self->rows('Subnet')->create($subnet) }) { 
    my $e = [email protected]; # [email protected] may be changed before `create => [email protected]` 
    undef $savepoint; # Or the same: $c->db->txn_rollback;  
    return $self->render('subnet/create', error => [ create => $e ], 
     servers => $self->rows('Server')->lookup, 
    ); 
} 
$savepoint->commit; 
+0

Vous devez ajouter une référence à cette citation, afin que les autres puissent lire son contexte. – xxfelixxx

+1

@xxfelixxx qui faisait partie du message d'erreur – ysth

+1

Vous devriez enregistrer $ @ dans une autre variable immédiatement dans le bloc à moins; Si vous mettez un autre code en premier, il se peut qu'il soit effacé ou modifié – ysth