импортируйте необходимые пакеты, затем подготовьте структуру с той же схемой, что и в примере таблицы tb_student в базе данных, в дальнейшем эта структура будет использоваться как контейнер для результата запроса тип данных.
package main import "fmt" import "database/sql" import _ "github.com/go-sql-driver/mysql" type student struct { id string, name string, age int, grade int, }
Используемый драйвер базы данных необходимо импортировать с использованием знака _, поскольку, хотя он и необходим пакету базы данных/sql, мы не взаимодействуем с драйвером напрямую.
Далее создайте функцию для подключения к базе данных.
func connect() (*sql.DB, error) { db, err := sql.Open("mysql","root:@tcp(127.0.0.1:3306)/db_learn_go") if err != nil { return nil, err } return db, nil }
Схема строки подключения для драйвера MySQL, которую мы используем, совершенно уникальна: root@tcp(127.0.0.1:3306)/db_learn_go ниже представляет собой схему строки подключения, которую можно использовать на ходу, драйвер драйвера MYSQL, если вы используете другой mysql, схема подключения может отличаться в зависимости от используемого драйвера.
user:password@tcp(host:port)/dbname user@tcp(host:port)/dbname
Ниже приведено объяснение строки подключения, используемой в функции Connect().
root@tcp(127.0.0.1:3306)/db_learn_go // user => root // password => // host => 127.0.0.1 atau localhost // port => 3306 // dbname => db_learn_go
После того, как функция подключения к базе данных создана, пришло время попрактиковаться в процессе чтения данных с сервера базы данных. Подготовьте функцию
sqlQuery() со следующим кодом.
func sqlQuery() { db, err := connect() if err != nil { fmt.Println(err.Error()) return } defer db.Close() var age = 27 rows, err := db.Query("select id, name, grade from tb_student where age = ? if err != nil { fmt.Println(err.Error()) return } defer rows.Close() var result []student for rows.Next() { var each = student{} var err = rows.Scan(&each.id, &each.name, &each.grade) if err != nil { fmt.Println(err.Error()) return } result = append(result, each) } if err = rows.Err(); err != nil { fmt.Println(err.Error()) return } for _, each := range result { fmt.Println(each.name) } }
Каждый раз, когда создается новое соединение, не забывайте всегда закрывать экземпляр соединения. Вы можете использовать ключевое слово defer, как в приведенном выше коде: defer
db.Close() .
Функция db.Query() используется для выполнения SQL-запросов. Второй параметр функции является переменным, поэтому его можно оставить пустым. В приведенном выше коде вы можете видеть, что значение одного из предложенийwhere представляет собой вопросительный знак (?).
Знак будет заменен значением в параметре после него (значение переменной age). Настоятельно рекомендуется использовать этот тип метода написания запросов, чтобы предотвратить внедрение sql. Функция создает экземпляр типа sql.*Rows, который также необходимо закрыть, когда он больше не используется (defer rows.Close()). Далее подготавливается массив с типом элемента struct Student с именем result. Позже результаты запроса будут сохранены в переменной. Затем выполняется цикл со ссылкой на условие rows.Next() . Этот цикл выполняется столько раз, сколько всего записей, последовательно от первой записи до конца, одна за другой. Метод Scan() функции sql.Rows извлекает значение повторяемой записи для сохранения в переменной-указателе. Переменные, используемые для хранения полей записи, записываются последовательно как переменные параметры в соответствии с полями, выбранными в запросе. Пожалуйста, посмотрите сравнение ниже для более подробной информации. // запрос
выберите идентификатор, имя, оценку ...
// сканирование
rows.Scan(&each.id, &each.name, &each.grade ...
Полученные данные записи затем добавляются к результирующему срезу с помощью оператора
результат = добавить(результат, каждый).
Хорошо, теперь просто вызовите функцию sqlQuery() в main и запустите программу.
функция main() {
sqlQuery()
}
Я обычный автор блога. Если у вас все еще слишком много недостатков, пожалуйста, простите меня.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3