Go SQL Server: Вставка данных

В этом уроке вы узнаете, как вставить строку в таблицу из программы на языке Go.

Вставить строку в таблицу

Шаг 1. Создайте новый файл author.go в каталоге проекта со следующим кодом:

package main
import(
    "database/sql"
    "time"
)
type Author struct {
    AuthorID  int
    FirstName string
    LastName  string
    BirthDate time.Time
}
func InsertAuthor(db *sql.DB, author *Author)(int64, error) {
    // Prepare the INSERT statement
    stmt, err := db.Prepare("INSERT INTO Authors(FirstName, LastName, BirthDate) VALUES(@FirstName, @LastName, @BirthDate);")
    if err != nil {
        return 0, err
    }
    defer stmt.Close()
    // Execute the prepared statement
    result, err := stmt.Exec(
        sql.Named("FirstName", author.FirstName),
        sql.Named("LastName", author.LastName),
        sql.Named("BirthDate", author.BirthDate),
    )
    if err != nil {
        return 0, err
    }
    // Get the number of row inserted
    rowInserted, err := result.RowsAffected()
    if err != nil {
        return 0, err
    }
    return rowInserted, nil
}

Шаг 2. Определите структуру Author, которая сопоставляется с таблицей Authors в базе данных SQL Server в author.go:

type Author struct {
    AuthorID  int
    FirstName string
    LastName  string
    BirthDate time.Time
}

Шаг 3. Создайте функцию InsertAuthor, которая вставляет новую строку в таблицу Authors:

func InsertAuthor(db *sql.DB, author *Author)(int64, error) {
    // Prepare the INSERT statement
    stmt, err := db.Prepare("INSERT INTO Authors(FirstName, LastName, BirthDate) VALUES(@FirstName, @LastName, @BirthDate);")
    if err != nil {
        return 0, err
    }
    defer stmt.Close()
    // Execute the prepared statement
    result, err := stmt.Exec(
        sql.Named("FirstName", author.FirstName),
        sql.Named("LastName", author.LastName),
        sql.Named("BirthDate", author.BirthDate),
    )
    if err != nil {
        return 0, err
    }
    // Get the number of row inserted
    rowInserted, err := result.RowsAffected()
    if err != nil {
        return 0, err
    }
    return rowInserted, nil
}

Как это работает.

Сначала создайте подготовленный оператор с помощью оператора SQL INSERT:

stmt, err := db.Prepare("INSERT INTO Authors(FirstName, LastName, BirthDate) VALUES(@FirstName, @LastName, @BirthDate);")

@FirstName, @LastName и @BirthDate являются заполнителями. При выполнении подготовленного оператора вам необходимо передать соответствующие значения для замены этих параметров. Используя эти параметры, вы можете предотвратить атаки SQL-инъекций.

Затем закройте подготовленный оператор после возврата функции, используя ключевое слово defer :

defer stmt.Close()

Затем выполните подготовленный оператор со значениями, полученными из структуры Author:

result, err := stmt.Exec(
    sql.Named("FirstName", author.FirstName),
    sql.Named("LastName", author.LastName),
    sql.Named("BirthDate", author.BirthDate),
)

После этого вернуть 0 и ошибку, если произошла ошибка:

if err != nil {
   return 0, err
}

Наконец, верните количество вставленных строк:

rowInserted, err := result.RowsAffected()
if err != nil {
    return 0, err
} else {
    return rowInserted, nil
}

Шаг 4. Измените main.go так, чтобы он вызывал функцию InsertAuthor для вставки новой строки в таблицу Authors:

package main
import(
    "fmt"
    "os"
    "time"
)
func main() {
    // Load the database configuration
    config, err := LoadConfig()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    // Connect to the database
    db, err := Connect(config)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    // Close the database connection once the main function exits
    defer db.Close()
    // Insert an author
    author := Author{
        FirstName: "John",
        LastName:  "Doe",
        BirthDate: time.Date(1980, 1, 1, 0, 0, 0, 0, time.UTC),
    }
    rowInserted, err := InsertAuthor(db, &author)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Printf("Row inserted: %d\n", rowInserted)
}

Как это работает.

Сначала инициализируем структуру автора для вставки:

author := Author{
    FirstName: "John",
    LastName:  "Doe",
    BirthDate: time.Date(1980, 1, 1, 0, 0, 0, 0, time.UTC),
}

Во-вторых, вставьте новую строку в таблицу «Авторы» и выведите количество вставленных строк:

rowInserted, err := InsertAuthor(db, &author)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
fmt.Printf("Row inserted: %d\n", rowInserted)

Шаг 5. Откройте терминал и запустите программу с помощью следующей команды:

go run main.go db.go author.go

Выход:

Row inserted: 1

Шаг 6. Запустите SQL Server Management Studio(SSMS), подключитесь к базе данных и выберите данные из таблицы Authors:

SELECT * FROM authors

Выход:

Вставка строки и возврат вставленного идентификатора

Шаг 1. Измените функцию InsertAuthor, чтобы вставить новую строку в таблицу Authors и вернуть вставленный идентификатор автора:

func InsertAuthor(db *sql.DB, author *Author)(int64, error) {
    // Prepare the INSERT statement
    stmt, err := db.Prepare(`INSERT INTO Authors(FirstName, LastName, BirthDate) 
                             OUTPUT inserted.AuthorID
                             VALUES(@FirstName, @LastName, @BirthDate);`)
    if err != nil {
        return 0, err
    }
    defer stmt.Close()
    // Execute the prepared statement and return the query result as rows
    rows, err := stmt.Query(
        sql.Named("FirstName", author.FirstName),
        sql.Named("LastName", author.LastName),
        sql.Named("BirthDate", author.BirthDate),
    )
    if err != nil {
        return 0, err
    }
    // Get the author ID
    var authorID int64
    for rows.Next() {
        err = rows.Scan(&authorID)
        if err != nil {
            return 0, err
        }
    }
    return authorID, nil
}

Как это работает(мы сосредоточимся на том, что меняется):

Сначала подготовьте оператор вставки, который вставляет новую строку в таблицу и возвращает вставленный идентификатор автора:

stmt, err := db.Prepare(`INSERT INTO Authors(FirstName, LastName, BirthDate) 
                         OUTPUT inserted.AuthorID
                         VALUES(@FirstName, @LastName, @BirthDate);`)
if err != nil {
    return 0, err
}

Во-вторых, вызовите метод Query(), чтобы выполнить подготовленный оператор и вернуть результат запроса в виде строк:

rows, err := stmt.Query(
    sql.Named("FirstName", author.FirstName),
    sql.Named("LastName", author.LastName),
    sql.Named("BirthDate", author.BirthDate),
)

В-третьих, пройдитесь по строкам, считайте идентификатор автора и верните его:

var authorID int64
for rows.Next() {
    err = rows.Scan(&authorID)
    if err != nil {
        return 0, err
    }
}
return authorID, nil

Шаг 2. Измените main.go, чтобы вставить новую строку в таблицу Authors и распечатать вставленную строку:

package main
import(
    "fmt"
    "os"
    "time"
)
func main() {
    // Load the database configuration
    config, err := LoadConfig()
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    // Connect to the database
    db, err := Connect(config)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    // Close the database connection once the main function exits
    defer db.Close()
    // Insert an author
    author := Author{
        FirstName: "Jane",
        LastName:  "Doe",
        BirthDate: time.Date(1990, 12, 15, 0, 0, 0, 0, time.UTC),
    }
    authorID, err := InsertAuthor(db, &author)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Printf("Author ID: %d\n", authorID)
}

Шаг 3. Откройте терминал и запустите программу:


go run main.go db.go author.go

Выход:

Author ID: 2

Вывод показывает, что автор с идентификатором 2 был вставлен в таблицу «Авторы».

Шаг 4. Запустите SQL Server Management Studio(SSMS), подключитесь к базе данных и выберите данные из таблицы Authors:

SELECT * FROM authors

Выход:

Go SQL Server Вставка и возврат идентификатора

Краткое содержание

  • Используйте метод Exec() для выполнения подготовленного оператора, чтобы вставить новую строку в таблицу и вернуть количество вставленных строк.
  • Используйте метод Query() для выполнения подготовленного оператора, чтобы вставить новую строку в таблицу и вернуть вставленный идентификатор.
Мирослав С.

Автор статей, ИБ-специалист