【Go语言学习系列34】数据库编程(一):SQL接口

go操作数据库 Go-SQL-Driver/MySQL 使用详解 go操作mysql的驱动包很多,这里讲解当下比较流行的Go-SQL-Driver/MySQL 1.下载安装   执行下面两个命令:     下载:go get github.com/Go-SQL-Driver/MySQL      安装:go install github.com/Go-SQL-Driver/MySQL   安装完成以后的文件截图        root/go_s是go工作目录... 阅读详情

📚 原创系列: “Go语言学习系列”

🔄 转载说明: 本文最初发布于"Gopher部落"微信公众号,经原作者授权转载。

🔗 关注原创: 欢迎扫描文末二维码,关注"Gopher部落"微信公众号获取第一手Go技术文章。

📑 Go语言学习系列导航

本文是【Go语言学习系列】的第34篇,当前位于第三阶段(进阶篇)

🚀 第三阶段:进阶篇
  1. 并发编程(一):goroutine基础
  2. 并发编程(二):channel基础
  3. 并发编程(三):select语句
  4. 并发编程(四):sync包
  5. 并发编程(五):并发模式
  6. 并发编程(六):原子操作与内存模型
  7. 数据库编程(一):SQL接口 👈 当前位置
  8. 数据库编程(二):ORM技术
  9. Web开发(一):路由与中间件
  10. Web开发(二):模板与静态资源
  11. Web开发(三):API开发
  12. Web开发(四):认证与授权
  13. Web开发(五):WebSocket
  14. 微服务(一):基础概念
  15. 微服务(二):gRPC入门
  16. 日志与监控
  17. 第三阶段项目实战:微服务聊天应用

📚 查看完整Go语言学习系列导航

📖 文章导读

在本文中,您将了解:

  • Go语言的数据库编程基础,特别是database/sql包的使用
  • 如何连接各种SQL数据库并配置连接池
  • 执行基本查询和修改操作的方法
  • 事务处理和预处理语句的使用
  • 如何正确处理NULL值和常见错误
  • 使用仓储模式组织数据库代码的最佳实践
  • 构建一个完整的用户管理系统示例

Go SQL接口编程

数据库编程(一):SQL接口

在前面六篇关于并发编程的文章中,我们深入探讨了Go语言的并发特性。从本篇开始,我们将转向另一个重要领域:数据库编程。Go语言提供了强大而灵活的数据库操作支持,本文将重点介绍标准库中的database/sql包,这是Go与各种SQL数据库交互的基础。

1. Go数据库编程概述

Go语言通过database/sql包提供了一套统一的SQL数据库接口,并通过各种数据库驱动实现了对具体数据库的支持。这种设计使得我们可以用相同的代码风格操作不同的数据库系统。

1.1 数据库访问结构

Go的数据库访问主要通过以下几个层次实现:

应用代码 → database/sql包 → 数据库驱动 → 具体数据库
  • database/sql:提供通用的SQL接口和连接池管理
  • 数据库驱动:实现具体数据库与database/sql接口的连接
  • 具体数据库:如MySQL、PostgreSQL、SQLite等

1.2 常用数据库驱动

以下是一些常用的Go数据库驱动:

  • MySQL: github.com/go-sql-driver/mysql
  • PostgreSQL: github.com/lib/pq
  • SQLite: github.com/mattn/go-sqlite3
  • Microsoft SQL Server: github.com/denisenkom/go-mssqldb

2. 数据库连接

2.1 导入必要的包

package main

import (
    "database/sql"
    "fmt"
    "log"
    
    _ "github.com/go-sql-driver/mysql" // 仅导入驱动,不直接使用
)

注意下划线前缀_表示仅注册驱动,而不直接引用包中的函数或变量。

2.2 建立数据库连接

func main() {
    // 数据源名称(DSN)格式:用户名:密码@协议(地址)/数据库?参数=值
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True"
    
    // 打开数据库连接
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        log.Fatal("连接数据库失败:", err)
    }
    defer db.Close() // 确保在函数退出时关闭数据库连接
    
    // 验证连接
    if err := db.Ping(); err != nil {
        log.Fatal("Ping数据库失败:", err)
    }
    
    fmt.Println("成功连接到数据库!")
}

2.3 连接池配置

database/sql包内置了连接池管理,我们可以配置连接池参数以优化性能:

// 设置最大打开连接数
db.SetMaxOpenConns(25)

// 设置最大空闲连接数
db.SetMaxIdleConns(5)

// 设置连接最大生命周期
db.SetConnMaxLifetime(5 * time.Minute)

// 设置空闲连接最大存活时间(Go 1.15+)
db.SetConnMaxIdleTime(10 * time.Minute)

连接池相关设置应根据应用负载和服务器资源进行调整。

3. 基本查询操作

3.1 执行简单查询

func queryExample(db *sql.DB) {
    // 查询单行
    var name string
    var age int
    
    row := db.QueryRow("SELECT name, age FROM users WHERE id = ?", 1)
    err := row.Scan(&name, &age)
    if err != nil {
        if err == sql.ErrNoRows {
            fmt.Println("未找到记录")
            return
        }
        log.Fatal("查询失败:", err)
    }
    
    fmt.Printf("用户: %s, 年龄: %d\n", name, age)
}

3.2 查询多行数据

func queryMultipleRows(db *sql.DB) {
    // 查询多行
    rows, err := db.Query("SELECT id, name, age FROM users WHERE age > ?", 18)
    if err != nil {
        log.Fatal("查询失败:", err)
    }
    defer rows.Close() // 非常重要:确保关闭rows
    
    // 遍历结果集
    for rows.Next() {
        var id int
        var name string
        var age int
        
        if err := rows.Scan(&id, &name, &age); err != nil {
            log.Fatal("Scan失败:", err)
        }
        
        fmt.Printf("ID: %d, 名称: %s, 年龄: %d\n", id, name, age)
    }
    
    // 检查遍历过程中的错误
    if err := rows.Err(); err != nil {
        log.Fatal("结果集遍历失败:", err)
    }
}

3.3 使用预处理语句

预处理语句可以提高性能并防止SQL注入攻击:

func preparedStatementExample(db *sql.DB) {
    // 准备语句
    stmt, err := db.Prepare("SELECT name, age FROM users WHERE id = ?")
    if err != nil {
        log.Fatal("准备语句失败:", err)
    }
    defer stmt.Close() // 确保关闭语句
    
    // 使用准备好的语句多次查询
    for id := 1; id <= 5; id++ {
        var name string
        var age int
        
        err := stmt.QueryRow(id).Scan(&name, &age)
        if err != nil {
            if err == sql.ErrNoRows {
                fmt.Printf("ID %d: 未找到记录\n", id)
                continue
            }
            log.Printf("查询ID %d失败: %v\n", id, err)
            continue
        }
        
        fmt.Printf("ID %d: 名称=%s, 年龄=%d\n", id, name, age)
    }
}

4. 修改数据操作

4.1 插入数据

func insertExample(db *sql.DB) {
    // 插入单条记录
    result, err := db.Exec(
        "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
        "张三", 30, "zhangsan@example.com",
    )
    if err != nil {
        log.Fatal("插入失败:", err)
    }
    
    // 获取自增ID
    id, err := result.LastInsertId()
    if err != nil {
        log.Fatal("获取最后插入ID失败:", err)
    }
    
    // 获取受影响行数
    rows, err := result.RowsAffected()
    if err != nil {
        log.Fatal("获取受影响行数失败:", err)
    }
    
    fmt.Printf("成功插入记录,ID: %d, 受影响行数: %d\n", id, rows)
}

4.2 更新数据

func updateExample(db *sql.DB) {
    // 更新记录
    result, err := db.Exec(
        "UPDATE users SET age = ?, email = ? WHERE id = ?",
        31, "zhangsan_new@example.com", 1,
    )
    if err != nil {
        log.Fatal("更新失败:", err)
    }
    
    // 获取受影响行数
    rows, err := result.RowsAffected()
    if err != nil {
        log.Fatal("获取受影响行数失败:", err)
    }
    
    fmt.Printf("成功更新记录,受影响行数: %d\n", rows)
}

4.3 删除数据

func deleteExample(db *sql.DB) {
    // 删除记录
    result, err := db.Exec("DELETE FROM users WHERE id = ?", 1)
    if err != nil {
        log.Fatal("删除失败:", err)
    }
    
    // 获取受影响行数
    rows, err := result.RowsAffected()
    if err != nil {
        log.Fatal("获取受影响行数失败:", err)
    }
    
    fmt.Printf("成功删除记录,受影响行数: %d\n", rows)
}

5. 事务处理

事务允许将多个数据库操作作为一个原子单元执行,要么全部成功,要么全部失败。

func transactionExample(db *sql.DB) {
    // 开始事务
    tx, err := db.Begin()
    if err != nil {
        log.Fatal("开始事务失败:", err)
    }
    
    // 使用defer和recover处理异常,确保事务正确结束
    defer func() {
        if r := recover(); r != nil {
            tx.Rollback()
            log.Printf("发生异常,事务回滚: %v", r)
        }
    }()
    
    // 执行第一个操作
    _, err = tx.Exec("INSERT INTO accounts (user_id, balance) VALUES (?, ?)", 1, 1000)
    if err != nil {
        tx.Rollback()
        log.Fatal("第一个操作失败,事务回滚:", err)
        return
    }
    
    // 执行第二个操作
    _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE user_id = ?", 200, 1)
    if err != nil {
        tx.Rollback()
        log.Fatal("第二个操作失败,事务回滚:", err)
        return
    }
    
    // 执行第三个操作
    _, err = tx.Exec("INSERT INTO transactions (user_id, amount, type) VALUES (?, ?, ?)", 1, 200, "withdrawal")
    if err != nil {
        tx.Rollback()
        log.Fatal("第三个操作失败,事务回滚:", err)
        return
    }
    
    // 提交事务
    err = tx.Commit()
    if err != nil {
        log.Fatal("提交事务失败:", err)
        return
    }
    
    fmt.Println("事务成功完成!")
}

6. 处理NULL值

数据库中的NULL值需要使用特殊的类型处理:

import (
    "database/sql"
    "fmt"
    "log"
    "time"
)

func nullValueExample(db *sql.DB) {
    // 声明可能包含NULL的变量
    var (
        id        int
        name      string
        age       sql.NullInt64
        email     sql.NullString
        createdAt sql.NullTime
    )
    
    // 查询可能包含NULL值的记录
    row := db.QueryRow("SELECT id, name, age, email, created_at FROM users WHERE id = ?", 1)
    err := row.Scan(&id, &name, &age, &email, &createdAt)
    if err != nil {
        log.Fatal("查询失败:", err)
    }
    
    // 安全地访问可能为NULL的值
    fmt.Printf("ID: %d, 名称: %s\n", id, name)
    
    if age.Valid {
        fmt.Printf("年龄: %d\n", age.Int64)
    } else {
        fmt.Println("年龄: NULL")
    }
    
    if email.Valid {
        fmt.Printf("邮箱: %s\n", email.String)
    } else {
        fmt.Println("邮箱: NULL")
    }
    
    if createdAt.Valid {
        fmt.Printf("创建时间: %v\n", createdAt.Time)
    } else {
        fmt.Println("创建时间: NULL")
    }
}

7. 常见错误和最佳实践

7.1 常见错误

  1. 未关闭资源:如rows.Close()stmt.Close()
  2. 忽略错误检查:尤其是rows.Err()
  3. 在循环中频繁准备语句:应在循环外准备,循环内执行
  4. 不正确的事务处理:没有处理提交或回滚
  5. 连接泄漏:比如使用了Query但没有迭代完所有结果

7.2 最佳实践

  1. 始终使用参数化查询:防止SQL注入攻击

    // 好的做法
    db.Query("SELECT * FROM users WHERE name = ?", username)
    
    // 不安全的做法
    db.Query("SELECT * FROM users WHERE name = '" + username + "'")
    
  2. 正确处理连接:设置合适的连接池参数

  3. 使用合适的查询函数

    • Query: 返回多行
    • QueryRow: 返回单行
    • Exec: 不返回行的操作(INSERT/UPDATE/DELETE)
  4. 使用事务确保数据完整性:在需要原子操作时使用事务

  5. 处理NULL值:使用sql.NullXXX类型处理可能为NULL的列

  6. 结构化应用代码:将数据库操作封装到专门的包或函数中

8. 实战案例:用户管理系统

下面是一个简单的用户管理系统示例,展示如何组织数据库代码:

package main

import (
    "database/sql"
    "fmt"
    "log"
    "time"

    _ "github.com/go-sql-driver/mysql"
)

// User 结构体表示用户信息
type User struct {
    ID        int
    Name      string
    Age       sql.NullInt64
    Email     sql.NullString
    CreatedAt time.Time
    UpdatedAt sql.NullTime
}

// UserRepository 用户仓储接口
type UserRepository struct {
    db *sql.DB
}

// NewUserRepository 创建用户仓储
func NewUserRepository(db *sql.DB) *UserRepository {
    return &UserRepository{db: db}
}

// GetByID 根据ID获取用户
func (r *UserRepository) GetByID(id int) (*User, error) {
    user := &User{}
    
    err := r.db.QueryRow(
        "SELECT id, name, age, email, created_at, updated_at FROM users WHERE id = ?", 
        id,
    ).Scan(
        &user.ID, 
        &user.Name, 
        &user.Age, 
        &user.Email, 
        &user.CreatedAt, 
        &user.UpdatedAt,
    )
    
    if err != nil {
        if err == sql.ErrNoRows {
            return nil, fmt.Errorf("用户 ID %d 不存在", id)
        }
        return nil, fmt.Errorf("查询用户 ID %d 失败: %w", id, err)
    }
    
    return user, nil
}

// Create 创建新用户
func (r *UserRepository) Create(user *User) (int, error) {
    result, err := r.db.Exec(
        "INSERT INTO users (name, age, email, created_at) VALUES (?, ?, ?, ?)",
        user.Name,
        user.Age,
        user.Email,
        time.Now(),
    )
    
    if err != nil {
        return 0, fmt.Errorf("创建用户失败: %w", err)
    }
    
    id, err := result.LastInsertId()
    if err != nil {
        return 0, fmt.Errorf("获取插入ID失败: %w", err)
    }
    
    return int(id), nil
}

// Update 更新用户信息
func (r *UserRepository) Update(user *User) error {
    _, err := r.db.Exec(
        "UPDATE users SET name = ?, age = ?, email = ?, updated_at = ? WHERE id = ?",
        user.Name,
        user.Age,
        user.Email,
        time.Now(),
        user.ID,
    )
    
    if err != nil {
        return fmt.Errorf("更新用户 ID %d 失败: %w", user.ID, err)
    }
    
    return nil
}

// Delete 删除用户
func (r *UserRepository) Delete(id int) error {
    result, err := r.db.Exec("DELETE FROM users WHERE id = ?", id)
    if err != nil {
        return fmt.Errorf("删除用户 ID %d 失败: %w", id, err)
    }
    
    affected, err := result.RowsAffected()
    if err != nil {
        return fmt.Errorf("获取受影响行数失败: %w", err)
    }
    
    if affected == 0 {
        return fmt.Errorf("用户 ID %d 不存在", id)
    }
    
    return nil
}

// FindByAgeRange 查找特定年龄范围的用户
func (r *UserRepository) FindByAgeRange(min, max int) ([]*User, error) {
    rows, err := r.db.Query(
        "SELECT id, name, age, email, created_at, updated_at FROM users WHERE age >= ? AND age <= ?",
        min, max,
    )
    if err != nil {
        return nil, fmt.Errorf("查询年龄范围 %d-%d 的用户失败: %w", min, max, err)
    }
    defer rows.Close()
    
    var users []*User
    
    for rows.Next() {
        user := &User{}
        
        err := rows.Scan(
            &user.ID,
            &user.Name,
            &user.Age,
            &user.Email,
            &user.CreatedAt,
            &user.UpdatedAt,
        )
        
        if err != nil {
            return nil, fmt.Errorf("扫描用户数据失败: %w", err)
        }
        
        users = append(users, user)
    }
    
    if err := rows.Err(); err != nil {
        return nil, fmt.Errorf("迭代用户结果集失败: %w", err)
    }
    
    return users, nil
}

func main() {
    // 连接数据库
    db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/userdb?parseTime=true")
    if err != nil {
        log.Fatal("连接数据库失败:", err)
    }
    defer db.Close()
    
    // 设置连接池参数
    db.SetMaxOpenConns(10)
    db.SetMaxIdleConns(5)
    db.SetConnMaxLifetime(time.Hour)
    
    // 创建用户仓储
    userRepo := NewUserRepository(db)
    
    // 创建用户示例
    newUser := &User{
        Name: "李四",
        Age: sql.NullInt64{Int64: 25, Valid: true},
        Email: sql.NullString{String: "lisi@example.com", Valid: true},
    }
    
    id, err := userRepo.Create(newUser)
    if err != nil {
        log.Fatal("创建用户失败:", err)
    }
    fmt.Printf("创建了新用户,ID: %d\n", id)
    
    // 查询用户示例
    user, err := userRepo.GetByID(id)
    if err != nil {
        log.Fatal("查询用户失败:", err)
    }
    fmt.Printf("查询到用户: ID=%d, 名称=%s\n", user.ID, user.Name)
    
    // 更新用户示例
    user.Name = "李四(已更新)"
    err = userRepo.Update(user)
    if err != nil {
        log.Fatal("更新用户失败:", err)
    }
    fmt.Println("已成功更新用户信息")
    
    // 查询年龄范围示例
    users, err := userRepo.FindByAgeRange(20, 30)
    if err != nil {
        log.Fatal("查询年龄范围的用户失败:", err)
    }
    fmt.Printf("找到 %d 个年龄在20-30之间的用户\n", len(users))
    
    for _, u := range users {
        if u.Age.Valid {
            fmt.Printf("- ID: %d, 名称: %s, 年龄: %d\n", u.ID, u.Name, u.Age.Int64)
        } else {
            fmt.Printf("- ID: %d, 名称: %s, 年龄: NULL\n", u.ID, u.Name)
        }
    }
}

9. 总结

Go语言的database/sql包提供了灵活而强大的数据库访问能力,通过统一的接口支持多种数据库。本文介绍了:

  1. 数据库连接:建立连接、配置连接池
  2. 基本查询:单行查询、多行查询、预处理语句
  3. 数据修改:插入、更新、删除
  4. 事务处理:事务的开始、提交和回滚
  5. NULL值处理:使用sql.NullXXX类型
  6. 最佳实践:资源管理、错误处理、参数化查询等
  7. 实战案例:用户管理系统的实现

掌握这些基础知识后,你可以构建可靠的数据库应用程序。在下一篇文章中,我们将探讨ORM技术,它可以进一步简化数据库操作。


👨‍💻 关于作者与Gopher部落

"Gopher部落"专注于Go语言技术分享,提供从入门到精通的完整学习路线。

🌟 为什么关注我们?

  1. 系统化学习路径:本系列44篇文章循序渐进,带你完整掌握Go开发
  2. 实战驱动教学:理论结合实践,每篇文章都有可操作的代码示例
  3. 持续更新内容:定期分享最新Go生态技术动态与大厂实践经验
  4. 专业技术社区:加入我们的技术交流群,与众多Go开发者共同成长

📱 关注方式

  1. 微信公众号:搜索 “Gopher部落”“GopherTribe”
  2. CSDN专栏:点击页面右上角"关注"按钮

💡 读者福利

关注公众号回复 “SQL” 即可获取:

  • Go数据库编程最佳实践指南
  • SQL优化技巧速查表
  • 数据库设计案例分析

期待与您在Go语言的学习旅程中共同成长!

三、自定义sql脚本编写:通过sql接口,参数可配置多维度验证 1分钟写完增、删、改、查、模糊检索、批量删除、批量修改、自带分页,postman测试API,而这些不需要你会写代码,只要会写sql即可。而且每个接口都可以设置单独缓存,限流,每个请求参数可以动态配置参数验证。没有任何配置,注解也非常少,学习成本低到你想不到,比springboot和jfinal更快更简单。 有兴趣的同学评论区留言获取下载地址,其他特性功能请观看作者其他文章,框架在不断完善中,所以... 阅读详情

相关推荐

5.1 database/sql接口

Go与PHP不同的地方是Go官方没有提供数据库驱动,而是为开发数据库驱动定义了些标准接口,开发者可以根据定义的接口来开发相应的数据库驱动,这样做有个好处,只要是按照标准接口开发的代码, 以后需要迁移数据库时,不需要任何修改。那么Go都定义了哪些标准接口呢?让我们来详细的分析sql.Register 这个存在于database/sql的函数是用来注册数据库驱动的,当第三方开发者开发数据库驱动时,都会实现init函数,在init里面会调用这个Register(name string, driver

Kaitiren的专栏 699

连接数据库个真正的接口

1.封装sql模块 // 1. 加载mysql const mysql = require('mysql'); // 2. 创建连接对象 const connection = mysql.createConnection({ // 对象的属性名字不能改变 host: 'localhost', port: 3306, //数据库端口 user: 'root', //用户 password: 'root', //密码 databas

TaoaT66的博客 4448

Go实战--go语言操作PostgreSQL数据库(github.com/lib/pq)

生命不止,继续 Go go go !!!之前关于golang操作数据库的博客:Go实战–go语言操作MySQL数据库(go-sql-driver/mysql)Go实战–go语言操作sqlite数据库(The way to go)Go实战–golang中使用MongoDB(mgo)Go实战–golang中使用redis(redigogo-redis/redis)今天跟大家分享golang中使用Pos

一蓑烟雨任平生 也无风雨也无晴 2万+

利用mysql接口

.前期准备 建立个空文件夹,对文件夹进行初始化,并在npm上下载express及router.结构大致如下图: 二.编写工具 ①加载mysql工具--②创建连接--③连接数据库--④将工具导出 // 1. 加载msyql var mysql = require('mysql'); // 2. 创建连接 var connection = mysql.createConnection({ host : 'localhost', // 你要连接的数据库服务器的地址 port

weixin_59324977的博客 4218

SQL接口

1. SQL 声明接口:Statement 在 java.sql 包中定义的 Statement 类代表要在数据库连接上执行的 SQL 语句,并且提供执行方法。 Connection 接口提供了生成 Statement 对象的方法。在般情况下,我们通过 connection.createStatement() 方法就可以得到 Statement 的实例。 有三种 Statement 对象

北京德润科技王磊 1982

Go语言学习系列00】Go语言学习系列导航

本文是Go语言学习系列的导航文档,提供了从入门到精通的学习路径,包含各阶段文章链接和内容概述,帮助读者系统化学习Go语言。

GopherTribe的博客 1562

Go语言中的数据库操作:从SQL到ORM

数据库操作是Go语言开发中不可或缺的部分。如何使用标准库进行数据库操作如何使用ORM框架如GORM和SQLx如何配置数据库连接池如何处理事务如何进行数据库迁移如何优化数据库性能通过选择合适的数据库操作方式和最佳实践,你可以构建更加高效、可靠的数据库应用,为用户提供更好的体验。

好代码自己会说话,烂代码才需要注释来圆谎 2643

golang操作mysqlgo-sql-driver 包使用)

go-sql-driver 使用 go-sql-driver 是go用来链接mysql数据库的包。截止当前时间github上star 9.3k 环境: go go-sql-driver go1.13.5 v1.5.0 安装: 使用go mod 进行安装 在go.mod 中加入: module github.com/luslin/tools go 1.13 require ( ...

luslin1711的博客 8435

gosql深度探索:从零开始用Go实现PostgreSQL的终极指南

gosql个用Go语言从零开始实现的PostgreSQL早期版本,它为开发者提供了个深入理解数据库内部工作原理的绝佳机会。通过这个项目,你可以亲身体验数据库从无到有的构建过程,掌握SQL解析、数据存储和查询执行的核心技术。 ## 快速上手:gosql的安装与基础使用 ### 键安装步骤 要开始使用gosql,只需通过以下简单命令克隆仓库并运行: ```bash $ git clon

gitblog_00909的博客 721

golang长途旅行第34站】网络编程

网络通信基于TCP/IP四层模型实现:链路层通过MAC地址在局域网内传输数据帧,网际层通过IP地址进行全球网络寻址和路由,传输层通过端口号区分应用程序并采用TCP协议保证可靠传输,应用层则提供HTTP等具体应用协议。核心标识包括MAC地址(设备物理标识,局域网有效)、IP地址(网络逻辑地址,全球唯)和端口号(应用程序标识,范围0-65535)。网络编程主要包括TCP Socket(底层数据传输)和HTTP编程(基于TCP的Web应用开发)两种方式,数据通过层层封装与解封实现端到端通信。

T18357726647的博客 1526

go 判断 连接断开_Go实战——go语言操作PostgreSQL数据库

生命不止,继续 Go go go !!!之前关于golang操作数据库的博客:Go实战–go语言操作MySQL数据库(go-sql-driver/mysql)Go实战–go语言操作sqlite数据库(The way to go)Go实战–golang中使用MongoDB(mgo)Go实战–golang中使用redis(redigogo-redis/redis)今天跟大家分享golang中使用Po...

weixin_29231027的博客 436

猫头虎分享2023年数据库发展趋势分析:DB-Engines的最新洞见 ‍

🔍 在本篇博客中,我们将深入探讨由OSC开源社区发布的最新DB-Engines数据库流行度排行榜。涵盖Oracle, MySQL, SQL Server等主流数据库的动态,以及PostgreSQL, Redis, Microsoft Access, MariaDB, Snowflake等数据库的显著变化。我们还将分析关系数据库、Key-Value数据库、文档数据库、时序数据库和图数据库的前10名排名。

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:CSDNWF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 2002

Golang 访问PostgreSQL数据库增删改查

    PostgreSQL是常见的免费的大型关系型数据库,具有丰富的数据类型,也是软件项目常用的数据库。因其可靠的稳定性,通常我们可以拿它来做Oracle的替代品。     使用Go语言访问PostgreSQL数据库,与其他数据库是略有不同的。     为了能够对数据库进行访问,我们先建立数据库cofoxdb,并建立个数据表user。     建表SQL脚本如下:   --...

冷月醉雪的博客 5095

golang编写mysql数据库_在golang中操作mysql数据库(1)实现增删改操作

**Golang操作mysql简介**Golang操作mysql数据库的感觉有点想php中的pdo对mysql操作,假设你原本是phper转型到golang中的接受起来很亲切,总体的感觉非常简单**Golang操作mysql的注意点**`golang实现了对mysql操作的标准库然而却没有实现mysql的驱动`因此我们需要先从github中下载go-sql-driver这个驱动包(建议在src目录...

weixin_30074763的博客 299

Golang操作数据库简单示例

在开始之前,你需要确保自己安装了Golang编程环境,安装MySQL数据库,有个可以用于编写代码的编辑器或IDE工具。在main.go中输入以下代码。对于数据库的操作完成后,需要释放数据库连接,在main函数中输入以下代码释放资源。接下来,让我们编写个函数,这个函数的功能是通过人名去查询数据库中的记录。在上面创建的目录下创建文件main.go,将以下代码粘贴到文件中。定义个函数用来插入数据并且返回插入数据在数据库中的id。在main.go中输入以下代码,连接数据库。然后,我们在main函数中调用。

weixin_45014413的博客 739

2024年最全慢 SQL 分析与优化,Golang开发实战讲解

MySQL使不使用索引与所查列无关,只与索引本身,where条件,order by 字段,group by 字段有关。索引的作用个是查找,个是排序。##### 业务拆分。

2401_84900243的博客 602

golang mysql建表_golang 访问Mysql数据库增删改查和连接池及空字段处理-Go语言中文社区...

首先我们建立个新的数据库cofoxdb和数据包user:新增管理员切换tab设置用户权限新建数据库 cofoxdb双击数据库成为当前库,点击图标后写入SQL建表脚本建表SQL脚本drop TABLE if exists `user`;CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '流水号',`userName`...

weixin_30621429的博客 411
上一篇: 【Go语言学习系列33】并发编程(六):原子操作与内存模型
下一篇: 【Go语言学习系列35】数据库编程(二):ORM技术
Gopher部落
博客等级 码龄1年 784粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gopher部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值