go对sqlite数据库的増改查删操作代码

package main

import (
    "database/sql"
    "fmt"

    // 当导入一个包时,该包下的文件里所有init()函数都会被执行。
    // 然而,有些时候我们并不需要把整个包都导入进来,仅仅是是希望它执行init()函数而已。
    // 这个时候就可以使用 import _ 引用该包。
    _ "github.com/mattn/go-sqlite3"
    "time"
)

// 报错
func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    // func Open(driverName, dataSourceName string) (*DB, error)
    // DB是一个数据库(操作)句柄,代表一个具有零到多个底层连接的连接池。
    // 它可以安全的被多个go程同时使用。
    // sql包会自动创建和释放连接;它也会维护一个闲置连接的连接池。
    // 如果数据库具有单连接状态的概念,该状态只有在事务中被观察时才可信。
    // 一旦调用了BD.Begin,返回的Tx会绑定到单个连接。
    // 当调用事务Tx的Commit或Rollback后,该事务使用的连接会归还到DB的闲置连接池中。
    // 连接池的大小可以用SetMaxIdleConns方法控制。
    //-------------------------------------------------------------------------------
    // Open打开一个dirverName指定的数据库,dataSourceName指定数据源,
    // 一般包至少括数据库文件名和(可能的)连接信息。
    // 大多数用户会通过数据库特定的连接帮助函数打开数据库,返回一个*DB。
    // Go标准库中没有数据库驱动。参见http://golang.org/s/sqldrivers获取第三方驱动。
    // Open函数可能只是验证其参数,而不创建与数据库的连接。
    // 如果要检查数据源的名称是否合法,应调用返回值的Ping方法。
    // 返回的DB可以安全的被多个go程同时使用,并会维护自身的闲置连接池。
    // 这样一来,Open函数只需调用一次。很少需要关闭DB。
    db, err := sql.Open("sqlite3", "./foo.db")
    checkErr(err)

    sqlTable := `
        CREATE TABLE IF NOT EXISTS userinfo(
            uid INTEGER PRIMARY KEY AUTOINCREMENT,
            username VARCHAR(64) NULL,
            departname VARCHAR(64) NULL,
            created DATE NULL
        );
    `
    // func (db *DB) Exec(query string, args ...interface{}) (Result, error)
    // Exec执行一次命令(包括查询、删除、更新、插入等),不返回任何执行结果。参数args表示query中的占位参数。
    db.Exec(sqlTable)

    //======================插入操作======================
    // Prepare创建一个准备好的状态用于之后的查询和命令。返回值可以同时执行多个查询和命令。
    // func (db *DB) Prepare(query string) (*Stmt, error)
    // Stmt是准备好的状态。Stmt可以安全的被多个go程同时使用。
    stmt, err := db.Prepare("insert into userinfo(username,departname,created) values(?,?,?)")
    checkErr(err)

    // func (s *Stmt) Exec(args ...interface{}) (Result, error)
    // Exec使用提供的参数执行准备好的命令状态,返回Result类型的该状态执行结果的总结。
    // result类型为接口,有两个方法:
    // LastInsertId() (int64, error)
    // RowsAffected() (int64, error)
    res, err := stmt.Exec("Vinnking", "办公室3", "2017-05-20")
    checkErr(err)

    // LastInsertId返回一个数据库生成的回应命令的整数。
    // 当插入新行时,一般来自一个"自增"列。
    // 不是所有的数据库都支持该功能,该状态的语法也各有不同。
    // LastInsertId() (int64, error)
    // ---------------------------------
    // RowsAffected返回被update、insert或delete命令影响的行数。
    // 不是所有的数据库都支持该功能。
    // RowsAffected() (int64, error)
    id, err := res.LastInsertId()
    checkErr(err)
    // 打印出受影响的id号
    fmt.Println(id)

    //=========================更新操作============================
    stmt2, err := db.Prepare("update userinfo set username=? where uid=?")
    checkErr(err)

    res, err = stmt2.Exec("Wangx", id)
    checkErr(err)

    // 返回受影响的行数
    affect, err := res.RowsAffected()
    checkErr(err)

    fmt.Println(affect)

    //==========================查询操作===========================

    // func (db *DB) Query(query string, args ...interface{}) (*Rows, error)
    // Query执行一次查询,返回多行结果(即Rows),一般用于执行select命令。
    // 参数args表示query中的占位参数。
    rows2, err := db.Query("select * from userinfo")
    checkErr(err)
    var (
        uid        int
        username   string
        department string
        created    time.Time
    )

    // func (rs *Rows) Next() bool
    // Next准备用于Scan方法的下一行结果。如果成功会返回真,如果没有下一行或者出现错误会返回假。
    // Err应该被调用以区分这两种情况。
    // 每一次调用Scan方法,甚至包括第一次调用该方法,都必须在前面先调用Next方法。
    // ---------------------------------------------------------------
    // func (rs *Rows) Scan(dest ...interface{}) error
    // Scan将当前行各列结果填充进dest指定的各个值中。
    // 如果某个参数的类型为*[]byte,Scan会保存对应数据的拷贝,该拷贝为调用者所有,可以安全的,修改或无限期的保存。
    // 如果参数类型为*RawBytes可以避免拷贝;参见RawBytes的文档获取其使用的约束。
    // 如果某个参数的类型为*interface{},Scan会不做转换的拷贝底层驱动提供的值。
    // 如果值的类型为[]byte,会进行数据的拷贝,调用者可以安全使用该值。
    for rows2.Next() {
        err = rows2.Scan(&uid, &username, &department, &created)
        checkErr(err)
        fmt.Println(uid, username, department, created)
    }
    // Close关闭Rows,阻止对其更多的列举。
    // 如果Next方法返回假,Rows会自动关闭,满足。
    // 检查Err方法结果的条件。Close方法时幂等的(多次调用无效的成功),不影响Err方法的结果。
    rows2.Close()

    //==========================删除操作=======================
    stmt3, err := db.Prepare("delete from userinfo where uid=?")
    checkErr(err)
    res, err = stmt3.Exec(id)
    checkErr(err)

    affect2, err := res.RowsAffected()
    checkErr(err)

    fmt.Println(affect2)

    // Close关闭数据库,释放任何打开的资源。
    // 一般不会关闭DB,因为DB句柄通常被多个go程共享,并长期活跃。
    db.Close()
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值