编程笔记 Golang基础 046 mssql数据库连接与操作

编程笔记 Golang基础 046 mssql数据库连接与操作

数据库操作是现代软件系统不可或缺的一部分,对软件的功能实现、性能优化、数据安全等方面起着至关重要的作用。Go语言中连接和操作Microsoft SQL Server(简称MSSQL)数据库,可以使用github.com/denisenkom/go-mssqldb这个官方推荐的开源驱动程序。

一、连接与操作

  1. 安装驱动

    如果你使用Go Modules(推荐),可以在项目目录下运行以下命令来安装mssql驱动:

    sh 复制代码
    go get github.com/denisenkom/go-mssqldb
  2. 导入所需包

    在你的Go代码中,你需要导入必要的包,包括database/sqlgithub.com/denisenkom/go-mssqldb

    go 复制代码
    package main
    import (
        "database/sql"
        _ "github.com/denisenkom/go-mssqldb"
    )
  3. 创建连接字符串

    准备好用于连接MSSQL数据库的DSN(Data Source Name)字符串,通常包含服务器地址、数据库名称、用户名和密码等信息:

    go 复制代码
    connStr := "server=localhost;user id=myusername;password=mypassword;database=mydb;encrypt=disable"

    注意:encrypt=disable可能仅适用于测试环境,在生产环境中应确保SSL加密连接。

  4. 打开数据库连接

    创建并打开数据库连接:

    go 复制代码
    db, err := sql.Open("mssql", connStr)
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()
    
    // 检查连接是否成功
    err = db.Ping()
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("Connected to MSSQL!")
  5. 执行SQL操作

    使用db对象执行SQL查询或命令:

    go 复制代码
    var myVar string
    err = db.QueryRow("SELECT value FROM mytable WHERE key = ?", someKey).Scan(&myVar)
    if err != nil {
        // 处理错误
    }
    
    // 插入数据示例
    stmt, err := db.Prepare("INSERT INTO mytable(key, value) VALUES(?, ?)")
    if err != nil {
        // 处理错误
    }
    res, err := stmt.Exec(someKey, someValue)
    if err != nil {
        // 处理错误
    }
    lastInsertedId, err := res.LastInsertId()
    // ...

请根据实际情况替换上述代码中的connStrsomeKeysomeValue等变量值。同时,请确保系统已正确安装了MSSQL的ODBC驱动或者兼容的TCP/IP协议驱动,并配置了正确的网络连接设置。在生产环境中,务必遵循安全最佳实践,例如使用参数化查询以防止SQL注入攻击,并妥善处理连接关闭和错误情况。

二、全局连接

在Go语言中,为了使数据库连接成为一个全局变量以便在程序任何位置都能访问,你可以创建一个全局变量并在初始化阶段就完成数据库连接。下面是一个示例:

go 复制代码
package main

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

	_ "github.com/denisenkom/go-mssqldb"
)

var (
	// 定义一个全局数据库连接对象
	db *sql.DB
)

// 初始化函数,在main函数之前执行
func init() {
	// 连接数据库的逻辑放在这里
	var err error
	connStr := "server=localhost;user id=myusername;password=mypassword;database=mydb;encrypt=disable"
	db, err = sql.Open("mssql", connStr)
	if err != nil {
		log.Fatal("Error opening connection:", err)
	}

	// 检查连接是否有效
	err = db.Ping()
	if err != nil {
		log.Fatal("Error pinging the database:", err)
	}
	fmt.Println("Database connected.")
}

func main() {
	// 现在整个程序中的任何函数都可以直接使用全局变量db来执行SQL操作
	// 示例:执行查询
	rows, err := db.Query("SELECT * FROM my_table")
	if err != nil {
		log.Fatal("Error querying data:", err)
	}
	defer rows.Close()

	// ...处理查询结果...
}

// 其他函数也可访问db
func performSomeDBOperation() (int64, error) {
	stmt, err := db.Prepare("INSERT INTO other_table values (?, ?)")
	if err != nil {
		return 0, err
	}
	defer stmt.Close()

	res, err := stmt.Exec(someValue1, someValue2)
	if err != nil {
		return 0, err
	}

	lastInsertedID, err := res.LastInsertId()
	if err != nil {
		return 0, err
	}

	return lastInsertedID, nil
}

这里的关键在于通过init函数初始化全局数据库连接,确保在程序开始执行时已经建立好连接。任何需要访问数据库的函数或方法都可以直接引用全局变量db来进行数据库操作。不过需要注意的是,全局连接可能会导致资源管理问题,比如忘记关闭连接或并发访问问题,因此在设计上应当考虑资源的有效管理和适当同步机制。

三、数据库连接字符串

数据库连接字符串是一种特定格式的文本字符串,用于描述如何连接到特定数据库服务器的具体信息,包括但不限于以下关键参数:

  • 服务器地址 (Server 或 Data Source):指定数据库服务器的域名或IP地址以及可选的实例名(对于SQL Server可能是 localhost\SQLEXPRESS)。

  • 数据库名称(Database 或 Initial Catalog):要连接的数据库的名称。

  • 用户认证

    • 用户名(User ID 或 UID):登录数据库所需的用户名。
    • 密码(Password 或 PWD):对应的用户密码。
    • 集成安全性 (Integrated Security 或 Trusted_Connection):如果是Windows集成身份验证,则设置为 trueSSPI(针对SQL Server),这表示使用当前用户的操作系统凭据而不是明确的用户名和密码。
  • 其他选项

    • 端口号(Port):非默认情况下需要指定的数据库服务监听端口。
    • 连接超时(Connection Timeout):等待连接响应的最大秒数。
    • 加密(Encrypt):指示是否启用SSL/TLS加密通信。
    • 提供商(Provider):对于某些数据库引擎(如Access的JET引擎),需要指定提供程序类型。

示例:

  • SQL Server连接字符串:

    text 复制代码
    Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;
  • SQL Server 集成安全连接字符串:

    text 复制代码
    Server=myServerAddress;Database=myDataBase;Integrated Security=True;
  • MySQL连接字符串:

    text 复制代码
    server=localhost;user=myusername;password=mypassword;database=mydb
  • Oracle连接字符串:

    text 复制代码
    Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=myorcldbservice)));User Id=myusername;Password=mypassword;
  • Access/Jet数据库连接字符串:

    text 复制代码
    Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\myFolder\myAccessFile.accdb;User Id=admin;Password=;

请注意,具体的连接字符串格式取决于所使用的数据库驱动和数据库类型。对于Go语言中连接MSSQL数据库,使用github.com/denisenkom/go-mssqldb驱动时,其格式应该符合SQL Server的连接字符串规范。

四、应用示例

下面是一个综合的Go应用程序实例,它连接到MSSQL数据库,执行查询并打印结果:

go 复制代码
package main

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

	_ "github.com/denisenkom/go-mssqldb"
)

func main() {
	connStr := "server=localhost;user id=myusername;password=mypassword;database=mydb;encrypt=disable"

	db, err := sql.Open("mssql", connStr)
	if err != nil {
		log.Fatal("Error opening connection:", err.Error())
	}
	defer db.Close()

	err = db.Ping()
	if err != nil {
		log.Fatal("Error pinging the database:", err.Error())
	}
	fmt.Println("Connected to MSSQL!")

	// 假设我们有一个名为'employees'的表,其中包含'id', 'name', 和 'position'字段
	rows, err := db.Query("SELECT id, name, position FROM employees")
	if err != nil {
		log.Fatal("Error querying data:", err.Error())
	}
	defer rows.Close()

	// 打印查询结果
	for rows.Next() {
		var id int
		var name string
		var position string
		if err := rows.Scan(&id, &name, &position); err != nil {
			log.Fatal("Error scanning row:", err.Error())
		}
		fmt.Printf("ID: %d, Name: %s, Position: %s\n", id, name, position)
	}

	if err := rows.Err(); err != nil {
		log.Fatal("Error iterating through rows:", err.Error())
	}
}

在这个例子中,我们首先打开与MSSQL数据库的连接,然后执行一个简单的查询来获取employees表中的所有记录。遍历查询结果并打印每一行的id、name和position字段。记得在操作完成后关闭rows和db连接。同样,这里的connStr需要替换为实际的数据库连接字符串。

小结

数据库操作在计算机程序设计中具有极其重要的地位,主要原因包括以下几个方面:

  1. 数据持久化:数据库能够持久地存储程序生成或收集的数据,使得即使在程序关闭后数据依然得以保留,这对于任何需要长期保存和追踪数据的应用程序来说至关重要。

  2. 数据共享:多个应用程序或进程可以通过访问同一数据库实现数据共享,避免了数据孤岛现象,增强了系统的整体性和协同工作能力。

  3. 数据组织与管理:数据库管理系统提供了数据结构(如表、索引)、关系模型、事务处理、并发控制、恢复机制等多种工具和技术,方便有效地组织、管理和检索数据。

  4. 安全性与完整性:数据库支持权限管理、角色分配,能够保证数据的安全性,防止未经授权的访问或修改。同时,通过约束(如主键约束、外键约束、唯一性约束等)和事务机制保障数据的一致性和完整性。

  5. 性能优化:数据库提供的查询优化器可以根据表结构、索引及统计信息自动优化查询语句,提高数据读取效率。此外,还可以通过缓存、预编译等手段进一步提升性能。

  6. 业务逻辑抽象:将数据层的操作从应用层分离出来,有助于降低耦合度,简化软件架构,便于进行模块化开发和维护。

  7. 数据分析与决策支持:数据库支持复杂的查询操作和聚合计算,结合BI(商业智能)工具,可以为决策者提供丰富的数据分析报告和可视化图表,助力企业决策。

综上所述,数据库操作是现代软件系统不可或缺的一部分,对软件的功能实现、性能优化、数据安全等方面起着至关重要的作用。

相关推荐
chnming19874 分钟前
STL关联式容器之map
开发语言·c++
进击的六角龙6 分钟前
深入浅出:使用Python调用API实现智能天气预报
开发语言·python
檀越剑指大厂6 分钟前
【Python系列】浅析 Python 中的字典更新与应用场景
开发语言·python
湫ccc14 分钟前
Python简介以及解释器安装(保姆级教学)
开发语言·python
程序伍六七17 分钟前
day16
开发语言·c++
wkj00122 分钟前
php操作redis
开发语言·redis·php
极客代码27 分钟前
【Python TensorFlow】进阶指南(续篇三)
开发语言·人工智能·python·深度学习·tensorflow
土豆湿33 分钟前
拥抱极简主义前端开发:NoCss.js 引领无 CSS 编程潮流
开发语言·javascript·css
界面开发小八哥40 分钟前
更高效的Java 23开发,IntelliJ IDEA助力全面升级
java·开发语言·ide·intellij-idea·开发工具
qystca1 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法