Как сделать универсальную функцию для выполнения select запроса на golang?

Пользователь

от brandyn_heller , в категории: Общие вопросы , 10 месяцев назад

Как сделать универсальную функцию для выполнения select запроса на golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

1 ответ

Пользователь

от elvis_paucek , 10 месяцев назад

@brandyn_heller 

Вы можете создать функцию, которая будет принимать параметры для SELECT-запроса, выполнять запрос к базе данных и возвращать результат.


Ниже приведен пример такой универсальной функции:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package main

import (
    "database/sql"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

// Функция для выполнения SELECT-запроса
func selectQuery(db *sql.DB, query string, args ...interface{}) ([]map[string]interface{}, error) {
    // Выполняем запрос к базе данных
    rows, err := db.Query(query, args...)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    // Получаем названия колонок
    columns, err := rows.Columns()
    if err != nil {
        return nil, err
    }

    // Создаем слайс для хранения результатов
    results := []map[string]interface{}{}

    // Создаем временную переменную для хранения значений колонок
    values := make([]interface{}, len(columns))
    for i := range values {
        values[i] = new(interface{})
    }

    // Обрабатываем каждую строку результата
    for rows.Next() {
        // Считываем значения колонок в values
        err := rows.Scan(values...)
        if err != nil {
            return nil, err
        }

        // Создаем мапу для хранения значений колонок
        row := map[string]interface{}{}

        // Получаем значения из values и сохраняем в мапе
        for i, column := range columns {
            val := *(values[i].(*interface{}))
            row[column] = val
        }

        // Добавляем мапу в результаты
        results = append(results, row)
    }

    return results, nil
}

func main() {
    // Подключение к базе данных
    db, err := sql.Open("mysql", "username:password@tcp(localhost:3306)/dbname")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Вызов функции selectQuery для выполнения SELECT-запроса
    query := "SELECT * FROM your_table WHERE your_column = ?"
    results, err := selectQuery(db, query, "some_value")
    if err != nil {
        log.Fatal(err)
    }

    // Вывод результатов
    for _, row := range results {
        log.Println(row)
    }
}


В этом примере мы создаем функцию selectQuery, которая принимает соединение с базой данных, строку SQL-запроса и аргументы для заполнения заполнителей (?) в запросе. Функция выполняет запрос с помощью db.Query, получает названия колонок с помощью rows.Columns, а затем считывает значения каждой строки с помощью rows.Next и rows.Scan. Результаты сохраняются в слайс results, который затем возвращается из функции.


В main-функции мы создаем подключение к базе данных с помощью sql.Open, а затем вызываем функцию selectQuery для выполнения SELECT-запроса. Результаты выводятся с помощью log.Println.