https://github.com/imega/txwrapper
SQL transaction wrapper on golang
https://github.com/imega/txwrapper
database mysql sql sqlite3 transaction
Last synced: about 1 month ago
JSON representation
SQL transaction wrapper on golang
- Host: GitHub
- URL: https://github.com/imega/txwrapper
- Owner: iMega
- License: apache-2.0
- Created: 2021-11-04T08:22:31.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2021-11-04T12:02:44.000Z (over 4 years ago)
- Last Synced: 2025-02-12T23:46:17.616Z (over 1 year ago)
- Topics: database, mysql, sql, sqlite3, transaction
- Language: Go
- Homepage:
- Size: 11.7 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# TxWrapper
TxWrapper is a sql transaction wrapper. It helps to exclude writing code for
rollback and commit commands.
### Usage
```go
import (
"context"
"database/sql"
"fmt"
"io/ioutil"
"os"
_ "github.com/mattn/go-sqlite3"
"github.com/imega/txwrapper"
)
func main() {
file, err := ioutil.TempFile("", "db")
if err != nil {
log.Fatalf("failed to create tmp file, %w", err)
}
filename := file.Name()
if err := file.Close(); err != nil {
log.Fatalf("failed to close tmp file, %w", err)
}
db, err := sql.Open("sqlite3", filename)
if err != nil {
log.Fatalf("failed to open db, %w", err)
}
ctx := context.Background()
w := txwrapper.New(db)
err := w.Transaction(ctx, nil, func(ctx context.Context, tx *sql.Tx) error {
if err := createEmailTable(ctx, tx); err != nil {
return err
}
if err := addEmail(ctx, tx, "info@example.com"); err != nil {
return err
}
return nil
})
if err != nil {
log.Fatalf("failed to open db, %w", err)
}
errDB := db.Close()
if err := os.Remove(filename); err != nil || errDB != nil {
log.Fatalf("failed to close db or remove tmp file, %w, %w", errDB, err)
}
}
func createEmailTable(ctx context.Context, tx *sql.Tx) error {
q := `CREATE TABLE IF NOT EXISTS email (
email VARCHAR(64) NOT NULL
)`
if _, err := tx.ExecContext(ctx, q); err != nil {
return fmt.Errorf("failed to execute query, %w", err)
}
return nil
}
func addEmail(ctx context.Context, tx *sql.Tx, email string) error {
q := `insert into email (email) values (?)`
if _, err := tx.ExecContext(ctx, q, email); err != nil {
return fmt.Errorf("failed to execute query, %w", err)
}
return nil
}
```