SQL数据库在行和列中存储数据集合。你可以使用SQL语言检索和更新关系数据库管理系统(RDBMS)中的数据。在众多SQL数据库中,最受欢迎的是MySQL、PostgreSQL、Microsoft SQL Server和SQLite。
在Go中与数据库交互的功能在数据库/sql包中,是标准库的一部分。
数据库/sql包使用驱动程序与SQL数据库进行交互。你可以为你的RDBMS导入一个合适的驱动包,并使用它与数据库进行交互。
在Go中开始使用SQL数据库
database/sql包是一个连接关系数据库的通用接口。要与特定的数据库服务器一起工作,你需要使用许多可用的驱动程序之一。
值得庆幸的是,你不必担心驱动之外的具体实现。数据库/sql包处理数据库操作,与你所连接的服务器无关。
一些最流行的Go数据库驱动是。
- Go-SQL 驱动程序(MySQL)
- PQ(PostgreSQL)
- Go-SQLite3(SQLite)
- MSSQL DB(Microsoft SQL Server)
你可以使用LibHunt驱动列表来寻找其他数据库类型的等价物。该列表还显示了每个数据库系统的相对流行程度。
安装和导入 Go 数据库驱动程序
一旦您创建了 Go 工作区并初始化了 Go 模块文件,请安装与您的数据库系统匹配的驱动程序。例如,在工作区目录下运行以下命令,安装MySQL或SQLite驱动程序。
go get -u github.com/go-sql-driver/mysqlgo get github.com/mattn/go-sqlite3
安装完驱动后,通过在软件包前加下划线来导入它的副作用。例如,将MySQL驱动与数据库/sql包一起导入。
import ( "database/sql" _ "github.com/go-sql-driver/mysql")
通过导入驱动包的副作用,你可以用它来连接数据库,并在数据库上执行操作。
用Go连接到一个SQL数据库
在导入数据库驱动程序后,你可以使用数据库/sql包的Open方法创建一个数据库连接。这个方法需要驱动程序的名称和数据库的路径(对于SQLite)或连接字符串(对于MySQL)。例如,使用以下任一方法。
db, err := sql.Open("sqlite3", "models/testdb.db") // SQLite db, err := sql.Open("mysql", "user:password@/dbname") // MySQL
一旦你尝试打开连接,记得要检查是否有错误。
if err != nil { log.Fatalln(err)}
根据你的数据库系统,如果数据库不存在,Open方法可能会返回一个错误。一旦你连接到一个数据库,你可以使用Open返回的数据库实例执行查询和准备语句。
执行SQL命令
你可以使用数据库实例的Prepare方法来执行SQL命令。Prepare方法接收一个SQL命令,并返回一个准备好的语句,以便与一个错误对象一起执行。例如,如果你想创建一个新表。
command, err := db.Prepare("CREATE TABLE IF NOT EXISTS login(username TEXT, password TEXT)")
上面的语句创建了一个名为login的表,如果它还不存在的话。这个新表有名为用户名和密码的字段,每个字段都是TEXT类型**。**
如果你要从你的程序中插入值到你的查询中,你可以使用问号(?)符号来表示占位符,然后在执行语句时传递参数。
command, err := db.Prepare("INSERT INTO login(username, password) values(?,?)")
一旦你创建了一个准备好的语句,你可以使用其Exec方法来执行它。这个方法让你从你的程序中传递参数值。
exec, err := command.Exec(value1, Value2)
if err != nil
{
return
}
**Exec()**返回的第一个值是数据库中SQL查询的结果。使用这个查询结果,你可以检查受影响的行数或最后插入的ID。
affected,
err := exec.RowsAffected()
if err != nil
{
return}
fmt.Println(affected)
id, err := exec.LastInsertId()
if err != nil
{
return}
fmt.Println(id)
获取查询结果
数据库/sql包允许你使用数据库实例的Query方法查询数据库结果。
rows, err := db.Query("SELECT * FROM User") if err != nil { return}
Query方法返回一个Rows结构,你可以用它来处理你的结果集。例如,你可以使用行实例的Next方法对其进行迭代并处理个别行。
var username, password string for rows.Next()
{
err := rows.Scan(&username, &password)
if err != nil
{
log.Fatalln(err)
}
fmt.Println(username, password)}
在上面的例子中,两个字符串变量--用户名和密码--代表每一列值。扫描方法将当前行解码为这些相应的变量。
SQL数据库总是很方便
使用数据库/sql包在Go中使用数据库是很简单的。你可以用它在Go中轻松地查询和执行SQL命令。
SQL数据库是许多应用程序的核心,特别是那些处理大型或复杂数据集的应用程序。你可以在你的简单项目中使用像内存中的SQLite数据库,如网络刮削,和建立机器人。
适当的SQL和数据库管理系统的知识对于在你的程序中有效地使用它们是必不可少的。然而,如果你选择不学习SQL,你可以学习如何使用ORM来与Go中的SQL数据库互动。