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

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

  • 一、连接与操作
  • 二、全局连接
  • 三、数据库连接字符串
  • 四、应用示例
  • 小结

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

一、连接与操作

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

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

    package main
    import ("database/sql"_ "github.com/denisenkom/go-mssqldb"
    )
    
  3. 创建连接字符串
    准备好用于连接MSSQL数据库的DSN(Data Source Name)字符串,通常包含服务器地址、数据库名称、用户名和密码等信息:

    connStr := "server=localhost;user id=myusername;password=mypassword;database=mydb;encrypt=disable"
    

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

  4. 打开数据库连接
    创建并打开数据库连接:

    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查询或命令:

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

package mainimport ("database/sql""fmt""log"_ "github.com/denisenkom/go-mssqldb"
)var (// 定义一个全局数据库连接对象db *sql.DB
)// 初始化函数,在main函数之前执行
func init() {// 连接数据库的逻辑放在这里var err errorconnStr := "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连接字符串:

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

    Server=myServerAddress;Database=myDataBase;Integrated Security=True;
    
  • MySQL连接字符串:

    server=localhost;user=myusername;password=mypassword;database=mydb
    
  • Oracle连接字符串:

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

    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数据库,执行查询并打印结果:

package mainimport ("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 intvar name stringvar position stringif 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(商业智能)工具,可以为决策者提供丰富的数据分析报告和可视化图表,助力企业决策。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知名比特币质押协议项目Babylon确认参加2024年在香港数码港举办的Hack.Summit()2024区块链开发者大会。

知名比特币质押协议项目Babylon确认参加2024年在香港数码港举办的Hack.Summit()2024区块链开发者大会。作为比特币生态的领军项目,Babylon积极参与全球区块链领域的交流与合作,此次出席大会将为其提供一个展示项目进展、交流技术与创新思路的重要平台。B…

2402. 2-SAT 问题(tarjan,2-SAT模板题)

活动 - AcWing 给定 n 个还未赋值的布尔变量 x1∼xn。 现在有 m 个条件,每个条件的形式为 “xi 为 0/1 或 xj 为 0/1 至少有一项成立”,例如 “x1 为 1 或 x3 为 0”、“x8 为 0 或 x4 为 0” 等。 现在,请你对这 n 个布尔变量进行赋值&am…

acwing算法提高之数据结构--树状数组

目录 1 专题介绍2 训练 1 专题介绍 本专题用来汇总使用树状数组算法求解的题目。 应用场景:给你长度为n的数组nums,可以改变第i个数的大小,求数组下标区间[left, right]内的前缀和。要求时间复杂度不超过 O ( l o g N ) O(logN) O(logN)。 …

使用 MySQL 实现 Java 版的 hashCode 函数

前提 MySQL 数据库的编码需要设置为 utf8 或 utf8mb4,因为下面给出的代码是以用 utf8 编码储存数据为前提的。 MySQL Function drop function if exists utf8_unicode; create function utf8_unicode(str varchar(1)) returns bigint begindeclare num_utf8 bigi…

【GB28181】SIP协议实践之Windows下VS2019编译eXosip、osip,测试(附工程源码,一键打开编译)

引言 SIP开源库或者GB28181,这里选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,以下帮大家整理编译过程。 如果不想编译,可以跳转文章末尾链接直接下载相应工程直接编译即…

登录校验认证

会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。 会话跟踪: 一种维护浏览器状态的方法,服务器需要识别多次请…

Aop注解+Redis解决SpringBoot接口幂等性(源码自取)

目录 一、什么是幂等性? 二、哪些请求天生就是幂等的? 三、为什么需要幂等 1.超时重试 2.异步回调 3.消息队列 四、实现幂等的关键因素 关键因素1 关键因素2 五、引入幂等性后对系统的影响 六、Restful API 接口的幂等性 实战Aop注解redis解…

计算机网络——计算机网络的性能

计算机网络——计算机网络的性能 速率带宽吞吐量时延时延宽带积往返时间RTT利用率信道利用率网络利用率 我们今天来看看计算机网络的性能。 速率 速率这个很简单,就是数据的传送速率,也称为数据率,或者比特率,单位为bit/s&#…

神经网络 梯度与神经元参数w、b关系;梯度与导数关系

参考:https://blog.csdn.net/weixin_44259490/article/details/90295146 视频:https://www.bilibili.com/video/BV1a14y167vh 概念 梯度与w的关系可以用梯度下降公式来表示:ww−α ∂ c o s t ∂ w \frac{\partial cost}{\partial w} ∂w∂…

vs创建asp.net core webapi发布到ISS服务器

打开服务器创建test123文件夹,并设置共享。 ISS配置信息: 邮件网站,添加网站 webapi asp.net core发布到ISS服务器网页无法打开解决方法 点击ISS Express测试,可以成功打开网页。 点击生成,发布到服务器 找到服务器IP…

idm对比aria2哪个好 aria2和idm哪个快 Aria2和IDM的原理

一、idm对比aria2哪个好 下面对aria2和idm进行对比,看看哪款更好。 idm: 优势: 1)可将下载速度提升5倍以上; 2)界面友好,操作简便; 3)支持多个主流的浏览器; 4&am…

基于Vue的娱讯移动端APP前端设计与实现

目 录 摘 要 Abstract 引 言 1绪论 1.1课题背景及目的 1.1.1移动端APP发展简介 3 1.1.2移动端APP的优势 3 1.2前端开发相关技术 1.2.1前端开发工具介绍 3 1.2.2 前端开发相关技术介绍 4 1.3本章小结 2系统分析 2.1功能需求分析 2.2系统工作流程 2.3本章小结 3系统设…

自研cloud框架专题–通用cache模块(五)

通用cache模块 项目特点1.保留原框架的集成,扩展,配置能力2.对于spring-cache增强1.引入核心依赖2.开启多cache配置2.自选缓存pom依赖 二:使用示例1.api示例2.注解示例三:配置说明1.REDISSON_LOCAL_MAP2.REDISSON_2PC 开源地址:https://github.com/28928…

【论文阅读】Segment Anything论文梳理

Abstract 我们介绍了Segment Anything(SA)项目:新的图像分割任务、模型和数据集。高效的数据循环采集,使我们建立了迄今为止最大的分割数据集,在1100万张图像中,共超过10亿个掩码。 该模型被设计和训练为可…

一例APC注入型病毒分析

概述 这个病毒通过可移动存储介质传播,使用了应用层APC注入和dga域名技术,整个执行过程分为4个阶段,首先从资源节中解密出一段shellcode和一个PE,执行shellcode,创建一个同名的傀儡进程,将解密出来的PE注入…

多轨迹建模方法的介绍与实操-基于R语言

本文介绍了多轨迹建模方法(Group-Based Multivariate Trajectory Modeling),这是一种扩展了单指标组基轨迹建模的技术,用于分析多个疾病生物标志物或临床重要因素的联合轨迹,以更好地理解和追踪疾病进程、行为或健康状…

2024蓝桥杯每日一题(归并排序)

一、第一题:火柴排队 解题思路:归并排序 重点在于想清楚是对哪个数组进行归并排序求逆序对 【Python程序代码】 from math import * n int(input()) a list(map(int,input().split())) b list(map(int,input().split())) na,nb [],[] for …

c++结构体中定义函数方法介绍

在C中,结构体(Struct)是一种用户自定义的数据类型,用于组织不同数据类型的成员。结构体可以包含变量、常量、函数等,使得数据的组织更加灵活。以下是关于C结构体中函数的介绍: 结构体声明: 在介…

【OpenGL手册12】 统一变量Uniform

OpenGL基础 - 统一变量Uniform 目录 一、说明二、 Uniform变量概念2.1 Uniform变量和特点2.2 Uniform变量定义方法2.3 Uniform变量赋值和传参 三、如何在Shader中自定义Location四、赋值五、统一变量缓冲对象六、赋值函数 一、说明 关于统一变量,也有一系列概念和方…

【嵌入式】字体极限瘦身术:Fontmin在嵌入式UI中的魔法应用(附3500常用汉字)

1. 概述 在嵌入式系统的用户界面(UI)设计中,字体的选择和优化至关重要。一个恰当的字体不仅能够提升用户体验,还能彰显产品特色。然而,由于嵌入式设备常常受限于存储空间和处理能力,大型字体文件可能成为性…