原版

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 := ;
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 := ;
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 = ?", );
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 > ?", );
//获取影响行数
aff_nums, _ := ret2.RowsAffected();
fmt.Println(aff_nums); //删除数据
ret3, _ := db.Exec("delete from test where id = ?", );
//获取影响行数
del_nums, _ := ret3.RowsAffected();
fmt.Println(del_nums); //预处理语句
stmt, _ := db.Prepare("select id,name from test where id = ?");
rows4, _ := stmt.Query();
//注意这里需要Next()下,不然下面取不到值
rows4.Next();
rows4.Scan(&id, &name);
fmt.Println(id, name); stmt2, _ := db.Prepare("insert into test values(null, ?, ?)");
rows5, _ := stmt2.Exec("", );
fmt.Println(rows5.RowsAffected()); //事务处理
tx, _ := db.Begin(); ret4, _ := tx.Exec("update test set price = price + 100 where id = ?", );
ret5, _ := tx.Exec("update test set price = price - 100 where id = ?", );
upd_nums1, _ := ret4.RowsAffected();
upd_nums2, _ := ret5.RowsAffected(); if upd_nums1 > && upd_nums2 > {
//只有两条更新同时成功,那么才提交
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: ""})
TDb.Create(&Login{Username: "oy", Password: ""}) } func (l *Login) WriteLogin() {
TDb.Create(&l)
} func (l *Login) Query() int {
flag := TDb.Where(&l).Find(&Login{}).RecordNotFound()
if flag {
return
} else {
return
} } 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)
}

数据库操作-go的更多相关文章

  1. 如何在高并发环境下设计出无锁的数据库操作(Java版本)

    一个在线2k的游戏,每秒钟并发都吓死人.传统的hibernate直接插库基本上是不可行的.我就一步步推导出一个无锁的数据库操作. 1. 并发中如何无锁. 一个很简单的思路,把并发转化成为单线程.Jav ...

  2. 【知识必备】ezSQL,最好用的数据库操作类,让php操作sql更简单~

    最近用php做了点小东东,用上了ezSQL,感觉真的很ez,所以拿来跟大家分享一下~ ezSQL是一个非常好用的PHP数据库操作类.著名的开源博客WordPress的数据库操作就使用了ezSQL的My ...

  3. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

  4. ABP创建数据库操作步骤

    1 ABP创建数据库操作步骤 1.1 SimpleTaskSystem.Web项目中的Web.config文件修改数据库配置. <add name="Default" pro ...

  5. 【第一篇】ASP.NET MVC快速入门之数据库操作(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  6. django数据库操作和中间件

    数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...

  7. [Android Pro] 完美Android Cursor使用例子(Android数据库操作)

    reference to : http://www.ablanxue.com/prone_10575_1.html 完美 Android Cursor使用例子(Android数据库操作),Androi ...

  8. phpcms v9 中的数据库操作函数

    1.查询 $this->select($where = '', $data = '*', $limit = '', $order = '', $group = '', $key='')   返回 ...

  9. Android打造属于自己的数据库操作类。

    1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...

  10. python之数据库操作

    数据库操作 Python 操作 Mysql 模块的安装 1 2 3 4 5 linux:     yum install MySQL-python   window:     http://files ...

随机推荐

  1. Beyond Compare 4的试用期过了怎么办

    修改配置文件(C:\Users\gaojs\AppData\Roaming\BCompare\BCompare.ini)中的时间戳. 时间戳在线转换:https://tool.lu/timestamp ...

  2. asmlinkage的作用

    本文转载自:http://blog.chinaunix.net/uid-24945116-id-83893.html 学习啦! asmlinkage是个宏,使用它是为了保持参数在stack中.因为从汇 ...

  3. 应用线性代数简介 - 向量,矩阵和最小二乘法 By Stephen Boyd and Lieven Vandenberghe

    Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares 应用线性代数简介 - 向量,矩阵和最小二乘法 ...

  4. yii2.0的gradview点击按钮通过get方式传参

    1.直接看views层里的代码就可以了 , <!--?= GridView::widget([ 'dataProvider' =--> $dataProvider, 'filterMode ...

  5. Oracle查看每小时日志切换量脚本

    ---- Show the Number of Redo Log Switches Per Hour-- SET PAUSE ONSET PAUSE 'Press Return to Continue ...

  6. mysql多实例mysqld_multi方式

    mysql多实例应用,亲测直接执行脚本可使用,可快速部署多实例环境 #!/bin/bash set -e #定义mysql_multi多实例数据的配置,如需增加,在后面函数对应地方需要增加 mydir ...

  7. SOJ3266 Birthday

    Time Limit: 1000MS Memory Limit: 65536 K Description Today is Windy's birthday. What can I say? Inpu ...

  8. xalan\xalan\2.7.2\xercesImpl.jar (系统找不到指定的文件)问题

    本文转自:http://blog.csdn.net/lveliu/article/details/77772828 环境搭建为:maven+tomcat tomcat 8.5.2 以上会出现改问题(包 ...

  9. DVR_RDK编译报错

    报错信息: abnormal termination of /opt/dm8168/dvr_rdk/../ti_tools/cgt_dsp/cgt6x_7_3_5//bin/cmp6x make[2] ...

  10. 在thinkphp5.0中调用ajax时, 返回的JSON 格式数据在html前台不能用时

    在thinkphp5.0中调用ajax时,如果控制器返回的数据为json格式,视图层接收到返回值即为json格式的数据,此时应该把 JSON 文本转换为 JavaScript 对象,方便调用.具体代码 ...