🎉 Sealos 首充折扣,限时返场!最高立返 10000,活动日期 4月22日-4月28日
Sealos Logo
数据库/PostgreSQL

Go

在 Sealos DevBox 中使用 Go 语言连接 PostgreSQL 数据库的完整指南

本教程将为你介绍如何在 Sealos DevBox 开发环境中使用 Go 语言连接并操作 PostgreSQL 数据库。

准备工作

在开始之前,请确保:

安装依赖

首先,在 Cursor 终端中运行以下命令来安装必需的依赖包:

go get github.com/lib/pq
go get github.com/joho/godotenv

这两个包各自的功能是:

  • github.com/lib/pq:为 database/sql 包提供的纯 Go 语言 PostgreSQL 驱动
  • github.com/joho/godotenv:Go 语言版本的环境变量管理工具,源自 Ruby 的 dotenv 库

配置连接

配置环境变量

第一步是配置数据库连接所需的环境变量。在项目根目录下创建一个 .env 文件,并写入以下内容:

.env
DB_HOST=your_database_host
DB_PORT=5432
DB_USER=your_username
DB_PASSWORD=your_password
DB_NAME=your_database_name

请将上述占位符替换为你在 Sealos Database 应用中获取的实际 PostgreSQL 连接信息。

编写 main.go 文件

接下来,创建一个 main.go 文件并输入以下代码:

main.go
package main
 
import (
	"database/sql"
	"fmt"
	"log"
	"os"
 
	"github.com/joho/godotenv"
	_ "github.com/lib/pq"
)
 
// Employee struct represents the structure of our data
type Employee struct {
	ID       int
	Name     string
	Position string
}
 
// connectDB establishes a connection to the PostgreSQL database
func connectDB() (*sql.DB, error) {
	// Load environment variables from .env file
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading .env file")
	}
 
	// Retrieve database connection details from environment variables
	dbHost := os.Getenv("DB_HOST")
	dbPort := os.Getenv("DB_PORT")
	dbUser := os.Getenv("DB_USER")
	dbPassword := os.Getenv("DB_PASSWORD")
	dbName := os.Getenv("DB_NAME")
 
	// Construct the connection string
	connStr := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
		dbHost, dbPort, dbUser, dbPassword, dbName)
 
	// Open a connection to the database
	db, err := sql.Open("postgres", connStr)
	if err != nil {
		return nil, err
	}
 
	// Verify the connection
	err = db.Ping()
	if err != nil {
		return nil, err
	}
 
	fmt.Println("Successfully connected to the database")
	return db, nil
}
 
// createTable creates the employees table if it doesn't exist
func createTable(db *sql.DB) error {
	_, err := db.Exec(`
		CREATE TABLE IF NOT EXISTS employees (
			id SERIAL PRIMARY KEY,
			name VARCHAR(100) NOT NULL,
			position VARCHAR(100) NOT NULL
		)
	`)
	return err
}
 
// insertEmployee inserts a new employee into the database
func insertEmployee(db *sql.DB, name, position string) error {
	_, err := db.Exec("INSERT INTO employees (name, position) VALUES ($1, $2)", name, position)
	return err
}
 
// getEmployees retrieves all employees from the database
func getEmployees(db *sql.DB) ([]Employee, error) {
	rows, err := db.Query("SELECT id, name, position FROM employees")
	if err != nil {
		return nil, err
	}
	defer rows.Close()
 
	var employees []Employee
	for rows.Next() {
		var emp Employee
		err := rows.Scan(&emp.ID, &emp.Name, &emp.Position)
		if err != nil {
			return nil, err
		}
		employees = append(employees, emp)
	}
	return employees, nil
}
 
func main() {
	// Connect to the database
	db, err := connectDB()
	if err != nil {
		log.Fatal(err)
	}
	// Ensure the database connection is closed when the function exits
	defer func() {
		if err := db.Close(); err != nil {
			log.Printf("Error closing database connection: %v", err)
		} else {
			fmt.Println("Database connection closed successfully")
		}
	}()
 
	// Create the employees table
	err = createTable(db)
	if err != nil {
		log.Fatal(err)
	}
 
	// Insert sample employees
	err = insertEmployee(db, "John Doe", "Developer")
	if err != nil {
		log.Fatal(err)
	}
 
	err = insertEmployee(db, "Jane Smith", "Designer")
	if err != nil {
		log.Fatal(err)
	}
 
	// Retrieve and display all employees
	employees, err := getEmployees(db)
	if err != nil {
		log.Fatal(err)
	}
 
	fmt.Println("Employees:")
	for _, emp := range employees {
		fmt.Printf("ID: %d, Name: %s, Position: %s\n", emp.ID, emp.Name, emp.Position)
	}
 
	// The database connection will be closed automatically when main() exits
	// due to the defer statement at the beginning of the function
}

这段代码的核心组成部分:

  1. 包的导入:导入了必需的包,其中 database/sql 用于数据库操作,github.com/lib/pq 则作为 PostgreSQL 驱动。

  2. Employee 结构体:用于定义员工数据的结构。

  3. connectDB 函数:实现了环境变量的加载、连接字符串的构建以及数据库的连接。

  4. createTable 函数:用于创建员工表 (如果该表尚不存在)。

  5. insertEmployee 函数:实现向数据库中添加新员工记录的功能。

  6. getEmployees 函数:负责查询并返回所有员工的信息。

  7. main 函数:作为程序入口,展示了完整的数据库操作流程。

运行程序

要运行这个程序,只需在 Cursor 终端中输入以下命令:

go run main.go

执行后,程序会依次展示数据库连接、表创建、数据插入和查询等完整的操作流程。

最佳实践

在实际开发中,请注意以下几点最佳实践:

  1. 始终使用环境变量来存储数据库凭据,避免硬编码。
  2. 对所有可能的错误情况进行完善的错误处理。
  3. 养成及时关闭数据库连接的好习惯。
  4. 使用预处理语句来防范 SQL 注入攻击。
  5. 在生产环境中,建议使用连接池来提升性能。

常见问题排查

如果遇到连接问题,请按以下步骤排查:

  1. 仔细核对 .env 文件中的数据库连接信息是否准确。
  2. 检查 PostgreSQL 数据库是否正常运行且可以访问。
  3. 排查 DevBox 环境中是否存在网络限制。
  4. 确认所有依赖包是否已正确安装。

想深入了解更多关于 Go 语言操作 PostgreSQL 的内容,欢迎查阅 lib/pq 官方文档

在 GitHub 上编辑

最后更新于

本页导航