В этом уроке вы узнаете, как вставить строку в таблицу из программы на языке 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
Выход:

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