目录
✅ 1. Import the Required Packages
✅ 2. Open a Connection to the Database
✅ 3. Perform Queries
✅ 4. Use Connection Pooling (Optional but Recommended)
Full Working Example (MySQL)
Summary
首页 后端开发 Golang 如何在GO中连接到SQL数据库?

如何在GO中连接到SQL数据库?

Aug 03, 2025 am 09:31 AM
go

要连接Go中的SQL数据库,需使用database/sql包和特定数据库驱动。1. 导入database/sql包和驱动(如github.com/go-sql-driver/mysql),注意驱动前加下划线表示仅用于初始化;2. 使用sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")创建数据库句柄,并调用db.Ping()验证连接;3. 使用db.Query()执行查询,db.Exec()执行插入、更新或删除,并通过rows.Scan()读取结果,注意检查rows.Err();4. 可配置连接池参数如db.SetMaxOpenConns(25)以优化性能。完整示例包含导入、连接、查询和资源释放,确保每步都处理错误,最终成功连接并操作数据库。

How to connect to a SQL database in Go?

Connecting to a SQL database in Go is straightforward using the database/sql package, which provides a generic interface for SQL databases, along with a driver specific to the database you're using (like MySQL, PostgreSQL, SQLite, etc.).

How to connect to a SQL database in Go?

Here’s how to do it step by step:


✅ 1. Import the Required Packages

You need two things:

How to connect to a SQL database in Go?
  • The database/sql package (standard Go library)
  • A driver for your specific database

For example, if you're using PostgreSQL, you might use lib/pq or jackc/pgx; for MySQL, go-sql-driver/mysql; for SQLite, mattn/go-sqlite3.

Install the driver via go.mod (example for MySQL):

How to connect to a SQL database in Go?
go get github.com/go-sql-driver/mysql

Then import in your code:

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql" // Import driver (note the underscore)
)

? The _ means we import it for its side effects (initializing the driver), not to use it directly.


✅ 2. Open a Connection to the Database

Use sql.Open() to create a database handle. It doesn’t connect immediately but initializes the connection info.

db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")
if err != nil {
    panic(err)
}
defer db.Close() // Make sure to close when done

Replace the connection string depending on your DB:

  • MySQL: "user:pass@tcp(localhost:3306)/mydb"
  • PostgreSQL: "host=localhost user=usr password=pass dbname=mydb sslmode=disable" (with jackc/pgx)
  • SQLite: "file:mydb.sqlite"

⚠️ sql.Open() may not return an error even if the DSN is wrong — it just prepares the connection. To test connectivity, use db.Ping().

err = db.Ping()
if err != nil {
    panic("could not connect to the database: "   err.Error())
}

✅ 3. Perform Queries

Once connected, you can run queries:

rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
    panic(err)
}
defer rows.Close()

for rows.Next() {
    var id int
    var name string
    err := rows.Scan(&id, &name)
    if err != nil {
        panic(err)
    }
    fmt.Printf("ID: %d, Name: %s\n", id, name)
}

// Check for errors after iteration
if err = rows.Err(); err != nil {
    panic(err)
}

Use db.Exec() for INSERT, UPDATE, DELETE:

result, err := db.Exec("INSERT INTO users (name) VALUES (?)", "Alice")
if err != nil {
    panic(err)
}

lastID, err := result.LastInsertId()
if err != nil {
    panic(err)
}
fmt.Printf("Last inserted ID: %d\n", lastID)

Go’s sql.DB is designed to be long-lived and handles connection pooling automatically.

You can tune it:

db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)

This helps avoid resource exhaustion in production.


Full Working Example (MySQL)

package main

import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1:3306)/testdb")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        log.Fatal("Failed to ping database:", err)
    }

    var version string
    err = db.QueryRow("SELECT VERSION()").Scan(&version)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Database version:", version)
}

Summary

  • Use database/sql a driver
  • Call sql.Open() with correct DSN
  • Always db.Ping() to verify connection
  • Use Query, Exec, QueryRow for operations
  • Let Go manage connections via pooling

It’s not complex, but easy to mess up DSN formatting or forget error checks after rows.Next().

Basically, that's all you need to get started connecting Go to a SQL database.

以上是如何在GO中连接到SQL数据库?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

Rimworld Odyssey温度指南和Gravtech
1 个月前 By Jack chen
初学者的Rimworld指南:奥德赛
1 个月前 By Jack chen
PHP变量范围解释了
4 周前 By 百草
撰写PHP评论的提示
3 周前 By 百草
在PHP中评论代码
3 周前 By 百草

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Laravel 教程
1604
29
PHP教程
1509
276
GO应用程序的标准项目布局是什么? GO应用程序的标准项目布局是什么? Aug 02, 2025 pm 02:31 PM

答案是:Go应用没有强制项目布局,但社区普遍采用一种标准结构以提升可维护性和扩展性。1.cmd/存放程序入口,每个子目录对应一个可执行文件,如cmd/myapp/main.go;2.internal/存放私有代码,不可被外部模块导入,用于封装业务逻辑和服务;3.pkg/存放可公开复用的库,供其他项目导入;4.api/可选,存放OpenAPI、Protobuf等API定义文件;5.config/、scripts/、web/分别存放配置文件、脚本和Web资源;6.根目录包含go.mod和go.sum

您如何在GO中解析命令行旗帜? 您如何在GO中解析命令行旗帜? Aug 02, 2025 pm 04:24 PM

Go的flag包可轻松解析命令行参数,1.使用flag.Type()定义字符串、整型、布尔等类型标志;2.可通过flag.TypeVar()将标志解析到变量避免指针操作;3.调用flag.Parse()后,用flag.Args()获取后续位置参数;4.实现flag.Value接口可支持自定义类型,满足多数简单CLI需求,复杂场景可用spf13/cobra库替代。

您如何使用诸如if-else in go中的条件语句? 您如何使用诸如if-else in go中的条件语句? Aug 02, 2025 pm 03:16 PM

Go中的if-else语句无需括号但必须使用花括号,支持在if中初始化变量以限制作用域,可通过elseif链式判断条件,常用于错误检查,且变量声明与条件结合可提升代码简洁性与安全性。

Go Run命令做什么? Go Run命令做什么? Aug 03, 2025 am 03:49 AM

gorun是一个用于快速编译并执行Go程序的命令,1.它在一步中完成编译和运行,生成临时可执行文件并在程序结束后删除;2.适用于包含main函数的独立程序,便于开发和测试;3.支持多文件运行,可通过gorun*.go或列出所有文件执行;4.自动处理依赖,利用模块系统解析外部包;5.不适用于库或包,且不生成持久化二进制文件,因此适合脚本、学习和频繁修改时的快速测试,是一种高效、简洁的即时运行方式。

您如何在Go中宣布常数? 您如何在Go中宣布常数? Aug 02, 2025 pm 04:21 PM

在Go中,常量使用const关键字声明,且值不可更改,可为无类型或有类型;1.单个常量声明如constPi=3.14159;2.块内多个常量声明如const(Pi=3.14159;Language="Go";IsCool=true);3.显式类型常量如constSecondsInMinuteint=60;4.使用iota生成枚举值,如const(Sunday=iota;Monday;Tuesday)将依次赋值0、1、2,且iota可用于位运算等表达式;常量必须在编译时确定值,

如何在GO中连接到SQL数据库? 如何在GO中连接到SQL数据库? Aug 03, 2025 am 09:31 AM

要连接Go中的SQL数据库,需使用database/sql包和特定数据库驱动。1.导入database/sql包和驱动(如github.com/go-sql-driver/mysql),注意驱动前加下划线表示仅用于初始化;2.使用sql.Open("mysql","user:password@tcp(localhost:3306)/dbname")创建数据库句柄,并调用db.Ping()验证连接;3.使用db.Query()执行查询,db.Exec()执行

登录的一些最佳实践是什么? 登录的一些最佳实践是什么? Aug 04, 2025 pm 04:48 PM

使用结构化日志记录、添加上下文、控制日志级别、避免记录敏感数据、使用一致的字段名、正确记录错误、考虑性能、集中监控日志并统一初始化配置,是Go中实现高效日志的最佳实践。首先,采用JSON格式的结构化日志(如使用uber-go/zap或rs/zerolog)便于机器解析和集成ELK、Datadog等工具;其次,通过请求ID、用户ID等上下文信息增强日志可追踪性,可通过context.Context或HTTP中间件注入;第三,合理使用Debug、Info、Warn、Error等级别,并通过环境变量动

如何优雅地关闭Go服务? 如何优雅地关闭Go服务? Aug 05, 2025 pm 08:21 PM

usesignal.notify()

See all articles