golang sqlite

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

от bradly.ledner , в категории: Общие вопросы , 4 года назад

Как в Golang’е использовать SQL? Для этого нужна какая-то специальная библиотека или как? Подскажите, пожалуйста, сам я что-то вообще не могу понять.


Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

9 ответов

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

от soledad , 4 года назад

Можешь зайти на metanit.com, там есть курс по Golang’у, в котором десятая глава про базы данных и там ты как раз найдёшь sqlite, про который всё подробно написано.


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

от bailee , 4 года назад

Пакет database/sql предоставляет общий интерфейс для баз данных SQL (или SQL-подобных). Но пакет database/sql должен использоваться вместе с драйвером базы данных.


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

от bailee , 4 года назад

Подключение к базе данных

Open используется для создания дескриптора базы данных:

 

 

db, err := sql.Open(driver, dataSourceName)

Где driver указывает драйвер базы данных, а dataSourceName указывает информацию о подключении к базе данных, такую ​​как имя базы данных и учетные данные для аутентификации.

 

Обратите внимание, что Open не открывает соединение с базой данных напрямую: это откладывается до выполнения запроса. Чтобы убедиться, что соединение может быть установлено перед выполнением запроса, используйте метод PingContext:

 

 

if err := db.PingContext(ctx); err != nil {

   log.Fatal(err)

}

После использования база данных закрывается с помощью метода Close.


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

от bailee , 4 года назад

Выполнение запросов

ExecContext используется для запросов, где строки ответа (rows) не возвращаются:

 

 

result, err := db.ExecContext(ctx,

   "INSERT INTO users (name, age) VALUES ($1, $2)",

   "gopher",

   27,

)

Где result содержит идентификатор последней вставки и количество затронутых строк. Доступность этих значений зависит от драйвера базы данных.

 

QueryContext используется для поиска:

 

 

rows, err := db.QueryContext(ctx, "SELECT name FROM users WHERE age = $1", age)

if err != nil {

   log.Fatal(err)

}

defer rows.Close()

for rows.Next() {

   var name string

   if err := rows.Scan(&name); err != nil {

       log.Fatal(err)

   }

   fmt.Printf("%s is %d\n", name, age)

}

if err := rows.Err(); err != nil {

   log.Fatal(err)

}


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

от bailee , 4 года назад

QueryRowContext используется там, где ожидается только одна строка ответа:

 

 

var age int64

err := db.QueryRowContext(ctx, "SELECT age FROM users WHERE name = $1", name).Scan(&age)

Подготовленные утверждения (statements) могут быть созданы с PrepareContext:

 

 

age := 27

stmt, err := db.PrepareContext(ctx, "SELECT name FROM users WHERE age = $1")

if err != nil {

   log.Fatal(err)

}

rows, err := stmt.Query(age)

// обработка строк ответа

ExecContext, QueryContext и QueryRowContext могут быть вызваны для утверждений (statements). После использования утверждение должно быть закрыто с помощью Close.


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

от bailee , 4 года назад

Транзакции

Транзакции начинаются с BeginTx:

 

 

tx, err := db.BeginTx(ctx, nil)

if err != nil {

   log.Fatal(err)

}

Уже описанные методы ExecContext, QueryContext, QueryRowContext и PrepareContext могут использоваться в транзакции.

Транзакция должна завершиться вызовом Commit или Rollback.


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

от bailee , 4 года назад

Работа с NULL

Если столбец базы данных обнуляется, один из типов, поддерживающих нулевые значения, должен быть передан в Scan.

 

Например, если столбец name в таблице names обнуляется:

 

 

var name sql.NullString

err := db.QueryRowContext(ctx, "SELECT name FROM names WHERE id = $1", id).Scan(&name)

...

if name.Valid {

   // используем name.String

} else {

   // значение равно NULL

}

В database/sql реализованы только NullBool, NullFloat64, NullInt64, NullInt32, NullString и NullTime. Реализации специфических для базы данных нулевых типов оставлены для драйвера базы данных. Пользовательские типы, поддерживающие NULL, могут быть созданы путем реализации интерфейсов database/sql/driver.Valuer и database/sql.Scanner.


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

от bradly.ledner , 4 года назад

Спасибо большое за подробное описание использование sqlite. Теперь мне стало всё понятно, и я наконец-таки смогу использовать эту библиотеку в своих целях.


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

от tessie_jacobs , 4 года назад

В восемнадцатом году видел стрим паренька на Ютубе, который делал игру на Golang’е с использованием OpenGL. Можешь посмотреть, только там всё на английском языке. Вот ссылка - https://www.youtube.com/watch?v=yxAPS2eyKmA