Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-06 09:54:08
avant
984 Les gens l'ont consulté

使用事务和 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
}
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!