这个是我用Go写的第一个东东,可能还存在些BUG没有测试到。这里主要是提供一个参考。各位可以改写成自己的风格。
在命令行下输入如下两条命令,进行安装
go get github.com/male110/SimpleDb
Go语言的数据库操作,只能用Rows.Scan来一次性读取所有列。感觉很不习惯,我还是习惯按照列名来一列列的取数据。所以我自己封装了一个数据结构MyRows,MyRows实现了一个函数,GetValue(name string, value interface{})可以按列名来取数据。如下所示:
err = rows.GetValue("IsBoy", &isBoy) if err != nil { fmt.Println(err) return }
为了操作方便,还定义了其它的结构体,如MyDb,其Query函数可以直接返回 MyRows。NewDb用来创建MyDb结构,其参数与sql.Open一至,怎么传取决于你所使用的驱动程序。
db, err := SimpleDb.NewDb("mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8") if err != nil { fmt.Println("打开SQL时出错:", err.Error()) return } var rows *SimpleDb.MyRows //从数据库中取数据 rows, err = db.Query("select * from person") if err != nil { fmt.Println(err) return } //显示数据 for rows.Next() { var id, age int var name string var isBoy bool //按字段名取数据,也可以用rows.Scan(&id,&name,&age),来取 rows.GetValue("id", &id) rows.GetValue("name", &name)rows.GetValue("age", &age) //可以根据返回值,判断是否成功 err = rows.GetValue("IsBoy", &isBoy) if err != nil { fmt.Println(err) return } fmt.Println(id, "\t", name, "\t", age, "\t", isBoy) }
同时还时现了一个简单的ORM,实现了最基本的插入数据,修改数据,删除数据。 我一般使用ORM只用这么几个方法,其它的都是写SQL语句。这里只是一个参考,大家可以根据自己的需要,自己习惯,进行修改。改成自己需要的格式。数据结构的定义格式如下:
type Person struct { /*TableName类型只是用来设置表名。如果结构体名跟表名相同可以省略*/ TableName SimpleDb.TableName "person"/*name是表名,PK用来设置是否主键,true主键,false非主键*/ Id int `name:"id"PK:"true"Auto:"true"` Name string "name" //tag里的name表是对应的字段名 Age int "age" //tag里的age表是对应的字段名 IsBoy bool NotUse string "-" //-不会保存到数据库中
}
上面的说明已经很详细了, SimpleDb.TableName类型的字段,只用来在tag中定义结构体对应的表名,如果没有该字段,认为表名就是结构体名相同。PK:"true"表示是主键,Auto:"true"表示该字段是自动增长的列,name:"id",来指定该字段对应的数据表中的列名,如不指定认为跟字段名相同。当只需要指定列名时,可以直接写在tag中,如:"name"、"age"。tag为"-"表示不对应数据表中的任何列。
// 插入数据 p := &Person{Name: "张三丰", Age: 500, IsBoy: true} db.Insert(p) //修改数据 db.Update(p) //删除数据 db.Delete(p)下面来看一个完整的例子,首先他创表:
CREATE TABLE `person` ( `id` INT(50) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NULL DEFAULT NULL, `age` INT(50) NULL DEFAULT NULL, `IsBoy` SMALLINT(10) NULL, `AddDate` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci';insert into
person
(name,age,IsBoy,AddDate) values('张三',20,0,now()); insert intoperson
(name,age,IsBoy,AddDate) values('王五',19,1,now());下面是完整的代码
package mainimport ( "SimpleDb" "fmt" _ "github.com/go-sql-driver/mysql" "time" )
type Person struct { /TableName类型只是用来设置表名。如果结构体名跟表名相同可以省略/ TableName SimpleDb.TableName "person"
/*name是表名,PK用来设置是否主键,true主键,false非主键*/ Id int `name:"id"PK:"true"Auto:"true"` Name string "name" //tag里的name表是对应的字段名 Age int "age" //tag里的age表是对应的字段名 IsBoy bool NotUse string "-" //-不会保存到数据库中 AddDate time.Time
}
func main() { db, err := SimpleDb.NewDb("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8") if err != nil { fmt.Println("打开SQL时出错:", err.Error()) return } defer db.Close() p := &Person{Name: "张三丰", Age: 500, IsBoy: true} p.AddDate = time.Now() //fmt.Println(p.AddDate) //fmt.Println(p.AddDate.Unix()) //插入一条数据 err = db.Insert(p) if err != nil { fmt.Println(err) return } fmt.Println("新插入数据的ID:", p.Id) var rows *SimpleDb.MyRows //从数据库中取数据 rows, err = db.Query("select * from person") if err != nil { fmt.Println(err) return } //显示数据 for rows.Next() { var id, age int var name string var isBoy bool var addDate time.Time //var a time.Time //按字段名取数据,也可以用rows.Scan(&id,&name,&age),来取 rows.GetValue("id", &id) rows.GetValue("name", &name)
rows.GetValue("age", &age) rows.GetValue("IsBoy", &isBoy) //可以根据返回值,判断是否成功 err = rows.GetValue("AddDate", &addDate) if err != nil { fmt.Println(err) return } fmt.Println(id, "\t", name, "\t", age, "\t", isBoy, "\t", addDate) fmt.Println(rows.Int("id"), "\t", rows.String("name"), "\t", rows.Int("age"), "\t", rows.Bool("IsBoy"), "\t", rows.Time("AddDate")) } rows.Close() //输出分割线 fmt.Println("==========割割割割割割割割============") p.Name = "彭祖" p.Age = 800 //修改数据 _, err = db.Update(p) if err != nil { fmt.Println(err) return } //QueryDataRows返回一个DataRow数组,DataRow中有一map来存放行中的数据 var arrRow []SimpleDb.DataRow arrRow, err = db.QueryDataRows("select * from person") if err != nil { fmt.Println(err) return } for _, row := range arrRow { //可以用String取所有字段的值用来显示 fmt.Println(row.String("id"), "\t", row.String("name"), "\t", row.String("age"), "\t", row.String("IsBoy"), "\t", row.String("AddDate")) } var p2 Person p2.Id = p.Id //根据主键从数据库中取单条数据 err = db.Load(&p2) if err != nil { fmt.Println(p2) fmt.Println("xxxxxx:", err) return } fmt.Println(p2) //根据主键删除一条数据 db.Delete(p2)
}
simpledb's People
Recommend Projects
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
TensorFlow
An Open Source Machine Learning Framework for Everyone
Django
The Web framework for perfectionists with deadlines.
Laravel
A PHP framework for web artisans
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
Recommend Topics
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
web
Some thing interesting about web. New door for the world.
server
A server is a program made to process requests and deliver data to clients.
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Visualization
Some thing interesting about visualization, use data art
Game
Some thing interesting about game, make everyone happy.
Recommend Org
We are working to build community through open source technology. NB: members must have two-factor auth.
Microsoft
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba
Alibaba Open Source for everyone
D3
Data-Driven Documents codes.
Tencent
China tencent open source team.