В этом уроке вы узнаете, как вставить строку в таблицу из программы на языке 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() для выполнения подготовленного оператора, чтобы вставить новую строку в таблицу и вернуть вставленный идентификатор.