Maison  >  Article  >  développement back-end  >  Requête Golang postgresql utilisant des transactions et un écureuil

Requête Golang postgresql utilisant des transactions et un écureuil

WBOY
WBOYavant
2024-02-06 09:54:08991parcourir

使用事务和 squirrel 进行 Golang postgresql 查询

Contenu de la question

Je comprends comment utiliser l'écureuil et les transactions séparément, mais je ne comprends pas comment les utiliser ensemble. Quand dois-je annuler ou valider ? Ma tentative est-elle correcte ? Sinon, où est-ce que je me suis trompé...

tx, err := db.repo.GetDatabase().Begin()
if err != nil {
    return nil, err
}

sb := squirrel.StatementBuilder.
    Insert("dependencies").
    Columns("correlation_id", "name", "age").
    PlaceholderFormat(squirrel.Dollar).
    RunWith(db.repo.GetDatabase())

for _, human:= range humans{
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

_, err = sb.Exec()
if err != nil {
    if err := tx.Rollback(); err != nil {
        return nil, err
    }
}

if err := tx.Commit(); err != nil {
    return nil, err
}

Si je comprends bien, j'essaie de revenir en arrière ou de valider après avoir exécuté une requête dans postgresql


Réponse correcte


Vos efforts sont formidables. Mais ....runwith(db.repo.getdatabase()) 在这种情况下是不正确的。因为您应该传递事务连接 tx . Demande à l'écureuil d'utiliser un objet de transaction comme connexion à la base de données pour la requête.

Si vous utilisez une connexion à une base de données au lieu d'une connexion transactionnelle, la requête écureuil ne fera pas partie de la transaction. Chaque requête sera exécutée individuellement et soumise immédiatement à la base de données.

Nous pouvons également utiliser l'instruction defer 语句更新 rollbackcommit, qui garantira que la transaction est correctement traitée et terminée avant la fermeture de la fonction.

Voici le code mis à jour..

tx, err := db.repo.GetDatabase().Begin()
if err != nil {
    return nil, err
}

// added defer rollback and commit
defer func() {
    if err != nil {
        fmt.Println("An error happened while executing the queries - ", err)
        tx.Rollback()
        return
    }
    err = tx.Commit()
}()

response := make([]storage.URLStorage, 0, len(urls))

sb := squirrel.StatementBuilder.
    Insert("dependencies").
    Columns("correlation_id", "name", "age").
    PlaceholderFormat(squirrel.Dollar).
    RunWith(tx)

for _, human := range humans {
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

// the error will be handled by the defer
_, err = sb.Exec()

// you can execute multiple queries with the transaction
for _, human := range someOtheSlice {
    sb = sb.Values(
        human.CorrelationID,
        human.Name,
        human.Age,
    )
}

_, err = sb.Exec()

// If any error happened this query executions, all will be roll backed with the defer

J'espère que cela vous aidera.

Voir aussi

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer