数据库操作-go

原版

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "fmt"
)
 
func main() {
    //打开数据库
    //DSN数据源字符串:用户名:密码@协议(地址:端口)/数据库?参数=参数值
    db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8");
    if err != nil {
        fmt.Println(err);
    }
 
    //关闭数据库,db会被多个goroutine共享,可以不调用
    defer db.Close();
 
    //查询数据,指定字段名,返回sql.Rows结果集
    rows, _ := db.Query("select id,name from test");
    id := 0;
    name := "";
    for rows.Next() {
        rows.Scan(&id, &name);
        fmt.Println(id, name);
    }
 
    //查询数据,取所有字段
    rows2, _ := db.Query("select * from test");
    //返回所有列
    cols, _ := rows2.Columns();
    //这里表示一行所有列的值,用[]byte表示
    vals := make([][]byte, len(cols));
    //这里表示一行填充数据
    scans := make([]interface{}, len(cols));
    //这里scans引用vals,把数据填充到[]byte里
    for k, _ := range vals {
        scans[k] = &vals[k];
    }
 
    i := 0;
    result := make(map[int]map[string]string);
    for rows2.Next() {
        //填充数据
        rows2.Scan(scans...);
        //每行数据
        row := make(map[string]string);
        //把vals中的数据复制到row中
        for k, v := range vals {
            key := cols[k];
            //这里把[]byte数据转成string
            row[key] = string(v);
        }
        //放入结果集
        result[i] = row;
        i++;
    }
    fmt.Println(result);
 
    //查询一行数据
    rows3 := db.QueryRow("select id,name from test where id = ?", 1);
    rows3.Scan(&id, &name);
    fmt.Println(id, name);
 
    //插入一行数据
    ret, _ := db.Exec("insert into test(id,name) values(null, '444')");
    //获取插入ID
    ins_id, _ := ret.LastInsertId();
    fmt.Println(ins_id);
 
    //更新数据
    ret2, _ := db.Exec("update test set name = '000' where id > ?", 2);
    //获取影响行数
    aff_nums, _ := ret2.RowsAffected();
    fmt.Println(aff_nums);
 
    //删除数据
    ret3, _ := db.Exec("delete from test where id = ?", 3);
    //获取影响行数
    del_nums, _ := ret3.RowsAffected();
    fmt.Println(del_nums);
 
    //预处理语句
    stmt, _ := db.Prepare("select id,name from test where id = ?");
    rows4, _ := stmt.Query(3);
    //注意这里需要Next()下,不然下面取不到值
    rows4.Next();
    rows4.Scan(&id, &name);
    fmt.Println(id, name);
 
    stmt2, _ := db.Prepare("insert into test values(null, ?, ?)");
    rows5, _ := stmt2.Exec("666", 66);
    fmt.Println(rows5.RowsAffected());
 
    //事务处理
    tx, _ := db.Begin();
 
    ret4, _ := tx.Exec("update test set price = price + 100 where id = ?", 1);
    ret5, _ := tx.Exec("update test set price = price - 100 where id = ?", 2);
    upd_nums1, _ := ret4.RowsAffected();
    upd_nums2, _ := ret5.RowsAffected();
 
    if upd_nums1 > 0 && upd_nums2 > 0 {
        //只有两条更新同时成功,那么才提交
        tx.Commit();
    } else {
        //否则回滚
        tx.Rollback();
    }
}

gorm 中文文档

package TDb

import (
    "log"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
)

//声明并初始化变量
var (
    err error    //错误
    TDb *gorm.DB //thcon Db 传输数据库
)

func init() {
    //连接数据库
    TDb, err = gorm.Open("sqlite3", "E:/test_data/thcon/apppath/data/ts_db/gorm.db")
    if err != nil {
        log.Println(err)
    }

}

type Login struct {
    Id       int    `gorm:"primary_key"`
    Username string `gorm:"size:20;NOT NULL;unique"`
    Password string `gorm:"size:20"`
}

func NewLogin(username, password string) *Login {
    return &Login{
        Username: username,
        Password: password,
    }
}
func Create() {
    flag := TDb.HasTable("logins")
    if flag {
        fmt.Println("logins 表存在")
    } else {
        fmt.Println("logins 表不存在")
        TDb.CreateTable(&Login{})
    }
    //TDb.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&Login{})
    //TDb.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&Login{})
    //TDb.CreateTable(&Login{})
    //TDb.Create(&Login{Id: 1, Username: "L1212", Password: "1000"})
    TDb.Create(&Login{Username: "L1212", Password: "1000"})
    TDb.Create(&Login{Username: "oy", Password: "159753"})

}


func (l *Login) WriteLogin() {
    TDb.Create(&l)
}

func (l *Login) Query() int {
    flag := TDb.Where(&l).Find(&Login{}).RecordNotFound()
    if flag {
        return 1
    } else {
        return 0
    }

}


func QueryAll() (result []Login) {
    row, err := TDb.Table("logins").Rows()
    if err != nil {
        fmt.Println(err)
    } else {
        var login *Login
        for row.Next() {
            login = &Login{}
            //fmt.Println(&login)
            row.Scan(&login.Id, &login.Username, &login.Password)
            result = append(result, *login)
        }
    }
    fmt.Println(result)
    return
}

func (l *Login) Alter1() {
    //Db.Where("username", l.Username).Model(&Login{}).Update(&l)
    //TDb.Where("username", l.Username).Model(&Login{}).Update(&l)
    //TDb.Where("username", l.Username).Model("logins").Update(&l)
    //TDb.Model("logins").Update(&l)

    err := TDb.Model(&Login{}).Where("username=?", l.Username).Updates(l)
    fmt.Println(err)

}

func (l *Login) Alter2() {
    err := TDb.Table("logins").Where("username=?", l.Username).Updates(l)
    fmt.Println(err)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值