Advertisement
ynifor

Untitled

May 23rd, 2025
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.89 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "database/sql"
  5.     "flag"
  6.     "log"
  7.  
  8.     _ "github.com/lib/pq"
  9. )
  10.  
  11. func main() {
  12.     var name string
  13.     flag.StringVar(&name, "name", "default", "account name")
  14.  
  15.     db, err := sql.Open("postgres", "dataSourceName") // предположим, что параметры берем из конфига, здесь это опущенно. Не считаем за ошибку
  16.     if err != nil {
  17.         db.Close()
  18.         log.Println(err)
  19.         return
  20.     }
  21.  
  22.     tx, err := db.Begin()
  23.     if err != nil {
  24.         log.Println(err)
  25.         return
  26.     }
  27.  
  28.     id, err := CreateAccount(tx, name)
  29.     if err != nil {
  30.         log.Println(err)
  31.         return
  32.     }
  33.  
  34.     if err := NewAccountEvent(id); err != nil {
  35.         log.Println(err)
  36.         return
  37.     }
  38.  
  39.     ids, err := GetAccountIdsByName(tx, name)
  40.     if err != nil {
  41.         log.Println(err)
  42.         return
  43.     }
  44.  
  45.     for _, id := range ids {
  46.         // какие-либо обновления
  47.         _ = id
  48.     }
  49.  
  50.     tx.Commit()
  51.  
  52.     db.Close()
  53. }
  54.  
  55.  
  56. package main
  57.  
  58. import (
  59.     "database/sql"
  60.     "fmt"
  61. )
  62.  
  63. func CreateAccount(tx *sql.Tx, name string) (int64, error) {
  64.     query := `INSERT INTO accounts VALUES (DEFAULT, &2) RETURNING id`
  65.  
  66.     var newID int64
  67.     if err := tx.QueryRow(query, name).Scan(newID); err != nil {
  68.         return 0, err
  69.     }
  70.  
  71.     return newID, nil
  72. }
  73.  
  74. func GetAccountIdsByName(tx *sql.Tx, name string) ([]int64, error) {
  75.     query := fmt.Sprintf(`SELECT * FROM accounts WHERE name = %s`, name)
  76.  
  77.     rows, err := tx.Query(query)
  78.     if err != nil {
  79.         return nil, err
  80.     }
  81.  
  82.     var res []int64
  83.     for rows.Next() {
  84.         var (
  85.             id   int64
  86.             name string
  87.         )
  88.         if err = rows.Scan(&id, &name); err != nil {
  89.             return nil, err
  90.         }
  91.         res = append(res, id)
  92.     }
  93.  
  94.     return res, nil
  95. }
  96.  
  97. func NewAccountEvent(id int64) error {
  98.     // нам не важна реализация этого метода
  99.     // предполагаем здесь отправку ивента в другой сервис через очередь
  100.     return nil
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement