首页 > 数据库 >database/sql库

database/sql库

时间:2023-06-11 17:56:10浏览次数:66  
标签:语句 err database 数据库 sql SQL 预处理

database/sql 是 Go 语言中一个标准库,用于处理关系型数据库的操作。它是一个轻量级的 SQL 数据库抽象,提供了一些基本的接口,包括连接、查询、事务等。database/sql 使用 SQL 驱动程序的方式连接不同的数据库,让我们可以使用统一的 API,而不用考虑底层数据库驱动的差异性。

连接数据库
使用 database/sql 连接数据库通常需要先安装相应的驱动程序,例如 MySQL、PostgreSQL 等,然后使用 sql.Open() 函数打开一个数据库连接。sql.Open() 函数的第一个参数是驱动程序名称,第二个参数是连接字符串。例如连接 MySQL 数据库:

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)
 
func main() {
    db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/dbname")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()
}

连接字符串中的 user 和 password 分别是数据库用户名和密码,tcp(localhost:3306) 是数据库地址和端口,dbname 是数据库名称。

执行查询

连接数据库成功后,我们可以使用 db.Query() 函数执行一个查询,并返回查询结果。例如:

rows, err := db.Query("SELECT * FROM users WHERE age > ?", 18)
if err != nil {
    panic(err.Error())
}
defer rows.Close()
 
for rows.Next() {
    var id intvar name stringvar age int
 
    err := rows.Scan(&id, &name, &age)
    if err != nil {
        panic(err.Error())
    }
 
    fmt.Printf("id: %d, name: %s, age: %d\n", id, name, age)
}

 

db.Query() 函数的第一个参数是 SQL 查询语句,第二个参数是可选的查询参数。查询结果是一个 *sql.Rows 对象,可以通过 rows.Next() 和 rows.Scan() 函数逐行读取查询结果。

执行修改

除了查询,database/sql 还支持执行修改语句,例如 INSERT、UPDATE、DELETE 等。使用 db.Exec() 函数可以执行任意的 SQL 语句,返回受影响的行数。例如:

result, err := db.Exec("INSERT INTO users (name, age) VALUES (?, ?)", "Alice", 20)
if err != nil {
    panic(err.Error())
}
 
rowsAffected, err := result.RowsAffected()
if err != nil {
    panic(err.Error())
}
 
fmt.Printf("Inserted %d rows\n", rowsAffected)

事务处理

在 database/sql 中,通过 Begin() 方法来开启一个事务,Commit() 方法来提交事务,Rollback() 方法来回滚事务。下面是一个简单的示例:

// 开启一个事务
tx, err := db.Begin()
if err != nil {
    log.Fatal(err)
}
 
// 执行一些操作
_, err = tx.Exec("INSERT INTO users (username, password) VALUES (?, ?)", "john", "pass123")
if err != nil {
    // 如果有任何错误发生,回滚事务
    tx.Rollback()
    log.Fatal(err)
}
 
// 执行另外一些操作
_, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE account_id = ?", 500, 1)
if err != nil {
    // 如果有任何错误发生,回滚事务
    tx.Rollback()
    log.Fatal(err)
}
 
// 提交事务
err = tx.Commit()
if err != nil {
    log.Fatal(err)
}

 

在这个示例中,我们首先使用 db.Begin() 方法开启一个事务。然后,我们执行一些操作,比如向 users 表中插入一行数据,和更新 accounts 表中某个账户的余额。如果任何一个操作失败了,我们使用 tx.Rollback() 方法来回滚事务。最后,我们使用 tx.Commit() 方法来提交事务。

需要注意的是,在事务中执行的所有操作都必须使用同一个数据库连接。因此,事务中所有操作的表名、列名等必须一致,否则会导致错误。

此外,在使用事务时,为了防止死锁,需要谨慎使用锁定操作,例如 SELECT ... FOR UPDATE 和 UPDATE ... WHERE ...。锁定操作可能会在高并发的情况下导致死锁,从而影响系统的性能。如果需要使用锁定操作,建议使用较短的事务时间,并在必要时使用分布式锁来避免死锁

预处理语句操作

预处理语句

在连接数据库之后,我们需要使用预处理语句来执行数据库操作。预处理语句通过将SQL语句和参数分开,可以提高执行SQL语句的效率和安全性。

我们可以使用Prepare函数来创建一个预处理语句:

stmt, err := db.Prepare("INSERT INTO users(name, age) VALUES(?, ?)")
if err != nil {
    log.Fatal(err)
}

在这里,我们创建了一个将用户的姓名和年龄插入到users表中的预处理语句。?符号代表参数,这里我们使用了两个参数,代表用户的姓名和年龄。

执行预处理语句

在创建了预处理语句之后,我们可以使用Exec函数来执行它:

res, err := stmt.Exec("Alice", 25)
if err != nil {
    log.Fatal(err)
}

我们使用Exec函数将用户Alice和她的年龄25插入到了users表中。

在执行预处理语句时,我们还可以使用Query函数来查询数据库中的数据,使用Exec函数来执行数据库中的更新和删除操作。

关闭连接和预处理语句

最后,在我们完成数据库操作后,需要关闭数据库连接和预处理语句。我们可以使用Close函数来关闭连接和语句:

defer stmt.Close()
defer db.Close()

使用了defer语句来确保连接和语句会在程序执行完毕后自动关闭,从而避免资源泄漏。

总结
1、连接池的使用:通过 sql.Open() 函数打开数据库连接时,可以设置连接池的大小,通过 SetMaxOpenConns() 和 SetMaxIdleConns() 函数设置最大打开连接数和最大空闲连接数,可以避免频繁创建和销毁数据库连接,提高数据库访问的效率。

2、事务的使用:在需要一次性提交多个 SQL 操作时,可以开启事务,通过 Begin() 函数返回的 Tx 对象进行操作,最后通过 Commit() 函数提交或者 Rollback() 函数回滚,避免多个 SQL 操作在不同的事务中执行。

3、预处理语句的使用:对于需要执行多次的 SQL 语句,可以使用预处理语句,通过 Prepare() 函数将 SQL 语句编译为预处理语句,再通过 Exec() 或 Query() 函数执行预处理语句,可以避免每次执行 SQL 语句时的语法解析和编译过程,提高执行效率。

4、数据库连接的复用:尽量避免在每个 SQL 操作时都创建一个新的数据库连接,可以使用 Conn.Begin() 函数返回的 Tx 对象执行多个 SQL 操作,或者使用 Conn.Prepare() 函数返回的预处理语句对象执行多次相同的 SQL 语句,可以避免频繁创建和销毁数据库连接,提高数据库访问的效率。

5、优化 SQL 语句:在编写 SQL 语句时,可以优化 SQL 语句的结构和索引,减少 SQL 语句的执行时间,提高数据库访问的效率。

标签:语句,err,database,数据库,sql,SQL,预处理
From: https://www.cnblogs.com/beatle-go/p/17473283.html

相关文章

  • Python内存数据库/引擎(sqlite memlite pydblite)
        1初探在平时的开发工作中,我们可能会有这样的需求:我们希望有一个内存数据库或者数据引擎,用比较Pythonic的方式进行数据库的操作(比如说插入和查询)。举个具体的例子,分别向数据库db中插入两条数据,”a=1,b=1″和“a=1,b=2”,然后想查询a=1的数据可能会使用这样的语句db......
  • MySQL Workbench的使用教程
        MySQLWorkbench是MySQLAB最近释放的可视数据库设计工具。这个工具是设计MySQL数据库的专用工具。MySQLWorkbench拥有很多的功能和特性;这篇由DjoniDarmawikarta写的文章通过一个示例展现了其中的一些。我们将针对一个订单系统建立一个物理数据模型,这里的订单......
  • mysql_三大范式
    介绍数据库的三大范式就是数据库的表应该如何设计,应该注意什么。第一范式要求每一张表都有一个主键,每一个字段都不可再分。举例:idusernameaddress1张三中国,北京2李四美国,洛杉矶1王五日本,东京问题:上面的这张表没有主键,因为第一条记录和第三条记录id......
  • mysql函数大全 整理
    对于针对字符串位置的操作,第一个位置被标记为1。ASCII(str)返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。mysql>selectASCII('2');  ->50mysql>selectASCII(2);  ->50mysql>selectASCII('dx');  ->100......
  • bcp...in...时,碰到问题:SQLState = S0002,NativeError = 208 错误
    1.直接在AdventureWorks2014中生成的脚本修改了下,生成一个表,2.然后将表中的数据导出成*.txtBCPAdventureWorks2013.Sales.SalesReasoninc:\tmp\SalesReason.txt-c-T3.再在一个数据库中testdb,建立一个表--在testdb中建议一个表SalesReason,将从AdventureWorks2014导......
  • Sql安装
    在MSDN,我告诉你-做一个安静的工具站(itellyou.cn)中选择合适的版本;也可以直接ed2k://|file|cn_sql_server_2012_developer_edition_with_sp1_x64_dvd_1234492.iso|4231520256|C3653494E5E01CA5ADFAF910CBC32D75|/下载这个链接下载好后会进入这个界面我们选择左上角的安装......
  • MySQL学习笔记-部署安装
    MySQL是一种常用的关系型数据库管理系统,可以用于存储和管理各种类型的数据。在本文中,我们将介绍如何在Linux操作系统上部署MySQL数据库,包括安装MySQL、创建数据库和用户、设置数据库安全性等。步骤如下:1.安装MySQL在Linux操作系统上安装MySQL通常需要使用包管理器,例如yum或apt-......
  • mysql GTID模式跳过错误GTID事务的正确方法
      最近遇到一个Mysql由于createtable时由于从库表表空间问题,从库sql重放进程执行sql失败,导致从库的sql应用进程挂掉。客户反馈,可以跳过失败的createtable事务,本博文展示mysql基于GITD模式跳过错误CTID事务的正确方法。  1.0明确错误原因root@mysqldb15:53:[(none)]>......
  • MySQL密码找回
    MySQL忘记密码如何找回以管理员身份打开cmd,关闭服务netstopmysql跳过密码授权登录mysqld--console--skip-grant-tables--shared-memory执行完这个命令后,进程会卡住,为正常情况。以管理员身份另外打开一个cmd进入mysql内置库,修改密码//依次输入以下命令mysqlu......
  • SQL Server 2008性能监视和优化工具
    MicrosoftSQLServer提供了一套综合的工具,用于监视SQLServer中的事件和优化物理数据库的设计。工具的选择取决于要执行的监视或优化类型和要监视的具体事件。以下是SQLServer监视和优化工具:工具 说明 sp_trace_setfilter(Transact-SQL) SQLServerProfiler用于跟......