golang面经必学之database/sql包的用法和场景

database/sql 包

Go语言的database/sql包提供了一个简单的SQL数据库接口,它是一个通用数据库驱动的抽象,可以与多种数据库一起使用,如MySQL、PostgreSQL、SQLite等。以下是database/sql包的一些基本用法和场景用例:

1. 导入包和驱动程序

使用database/sql包之前,需要导入它以及特定数据库的驱动程序。

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

	_ "github.com/go-sql-driver/mysql" // 导入MySQL驱动
)

这里的_导入表示我们并不直接使用这个包,但它必须被导入以注册驱动。

2. 连接数据库

使用sql.Open函数连接到数据库。

用法示例:

dsn := "username:password@/dbname"
db, err := sql.Open("mysql", dsn)
if err != nil {
	log.Fatal(err)
}
defer db.Close()

// 测试连接
err = db.Ping()
if err != nil {
	log.Fatal(err)
}

3. 创建表和插入数据

使用Exec函数创建表和插入数据。

用法示例:

// 创建表
_, err = db.Exec("CREATE TABLE users (id INT PRIMARY KEY, username VARCHAR(255), email VARCHAR(255))")
if err != nil {
	log.Fatal(err)
}

// 插入数据
result, err := db.Exec("INSERT INTO users (id, username, email) VALUES (1, 'gopher', 'gopher@golang.org')")
if err != nil {
	log.Fatal(err)
}

// 获取最后插入的ID
lastID, err := result.LastInsertId()
if err != nil {
	log.Fatal(err)
}
fmt.Println("Last inserted ID:", lastID)

4. 查询数据

使用Query或QueryRow函数查询数据。

用法示例:

// 使用Query
rows, err := db.Query("SELECT id, username, email FROM users")
if err != nil {
	log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
	var id int
	var username, email string
	err = rows.Scan(&id, &username, &email)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("ID: %d, Username: %s, Email: %s\n", id, username, email)
}

// 使用QueryRow
row := db.QueryRow("SELECT id, username, email FROM users WHERE id = ?", 1)
var id int
var username, email string
err = row.Scan(&id, &username, &email)
if err != nil {
	log.Fatal(err)
}
fmt.Printf("ID: %d, Username: %s, Email: %s\n", id, username, email)

5. 事务处理

使用Tx对象处理事务。

用法示例:

// 开启一个事务
tx, err := db.Begin()
if err != nil {
	log.Fatal(err)
}

// 在事务中执行操作
_, err = tx.Exec("DELETE FROM users WHERE id = ?", 1)
if err != nil {
	log.Fatal(err)
}

// 提交事务
err = tx.Commit()
if err != nil {
	log.Fatal(err)
}

场景用例

  1. Web应用开发:在Web应用中使用数据库存储和检索用户信息、文章内容等。
  2. 数据持久化:开发任何需要数据持久化的应用,如桌面应用程序、移动应用等。
  3. 数据分析:执行SQL查询以分析存储在数据库中的数据。
  4. 报告生成:从数据库中提取数据并生成业务报告。
  5. 用户认证:存储和验证用户认证信息。
  6. 内容管理系统(CMS):开发CMS时管理内容和元数据。
  7. 电子商务:处理订单、库存、客户信息等。

database/sql包是Go语言中进行数据库编程的标准方式,通过它,你可以与多种关系型数据库进行交互,实现数据的增删改查等操作。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供一个使用Golang编写的AES/ECB/PKCS5Padding的加密解密方法工具类。下面是示例代码: ```go package main import ( "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) func main() { key := []byte("0123456789abcdef") plaintext := []byte("Hello, World!") ciphertext, err := encrypt(key, plaintext) if err != nil { fmt.Println("Error encrypting:", err) return } fmt.Println("Ciphertext:", base64.StdEncoding.EncodeToString(ciphertext)) decryptedText, err := decrypt(key, ciphertext) if err != nil { fmt.Println("Error decrypting:", err) return } fmt.Println("Decrypted text:", string(decryptedText)) } func encrypt(key, plaintext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } // Add PKCS5 padding to the plaintext padding := aes.BlockSize - len(plaintext)%aes.BlockSize padText := append(plaintext, bytes.Repeat([]byte{byte(padding)}, padding)...) ciphertext := make([]byte, len(padText)) // ECB mode does not require an IV mode := cipher.NewCBCEncrypter(block, key[:aes.BlockSize]) mode.CryptBlocks(ciphertext, padText) return ciphertext, nil } func decrypt(key, ciphertext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } // ECB mode does not require an IV mode := cipher.NewCBCDecrypter(block, key[:aes.BlockSize]) mode.CryptBlocks(ciphertext, ciphertext) // Remove PKCS5 padding padding := ciphertext[len(ciphertext)-1] return ciphertext[:len(ciphertext)-int(padding)], nil } ``` 在这个示例中,我们使用了crypto/aes和crypto/cipher库来进行AES加密和解密。`encrypt`函数接受一个密钥和明文作为输入,并返回加密后的密文。`decrypt`函数接受同样的密钥和密文,返回解密后的明文。 请注意,这里使用的是ECB模式,这是一种基本的加密模式,不含有初始化向量(IV)。在实际应用中,推荐使用更安全的加密模式,如CBC模式,并生成随机的IV。 希望这个示例对您有帮助!如有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值