使用 GORM连接数据库并实现增删改查操作 | 青训营

66 阅读3分钟

1 连接数据库 var Db *sq1.DB func init(){ var err error sslmode disable") Db,err-sg1.Open("postgres","user-gwp dbname-gup passrord-gwp if err !- nil ( panic(err)

sq1.DB结构是一个数据库句柄(handle)代一个包了个或任意多个数据库接的连接池(pool)这个包管理。程通过调用pen数,并相应据库驱动名字(driver name)及数据源名字(daouceame传该数来建立与数据的连接。比如,在上面展示的例子中,程序使用的是 postgres 驱动。数据源名字是一个特定于据库驱动的字符串,它会告诉驱动应该如何与数据库进行连接。Open执之后回个指向sq1DB结构的指针作为结果。 需要注意的是,Open函数在执行时并不会真正地与数据库进行连接,它甚至不会检查用给定的参数:Open设置据的各个结构,并以惰性的方式,到真正需要时才建立相应的数据库连接。 此外,因为sq1DB只是一个句柄而不是实际的连接,而这个句柄代表的是一个会自动对接进行管理的连接池,所以尽管用户可以手动关闭sq1DB,但是在实际中常并不需要这样在上面展示的例子中,程序通过全局定义的Db变量在各个CRUD方法以及函数中使用sq1结构;但除此之外,我们也可以选择在创建sq1DB结构之后,通过向方法或者函数传递这个构的方式来使用它。 到目前为止,我们讨论的都是Open函数,这个函数接受数据库驱动名字和数据源名字作参数,然后返回一个sq1DB结构作为结果。那么程序本身又是如何获取数据库驱动的呢?一来说,程序都会向Register函数提供一个数据库驱动名字以及一个实现了driver.Drive接口的结构,以此来注册将要用到的数据库驱动,就像这样:.m个 sql.Register("postgres", adrv{l) 这个例子中的postgres就是数据库驱动的名字,而drv则是实现了Driver接口的结构你也许已经注意到了,前面展示的数据库程序并没有包含类似的注册代码,这是因为程序使用的第三方 Postgres 驱动在被导人的时候已经自行实现了注册: import( "fmt""database/sql" "github.com/1ib/pq" 上面这段代码中的github.com/1ib/pq包就是程导人的Postgres驱动,在导人这个包之后,包内定义的init会调用,并其自进行注册。因为o供方数据库驱动,所以o驱动是第三方数,并且这些库必须遵守 sq1.driver包中定义的接口。注意,因为程在操作数据库的时候只需要用到database/ sq1,而不需要直接使用数据库驱动,所以程序在导人 Postgres 数据库驱动的时候将这个包的名字设置成了下划线(_)。这种引用数据库驱动的方式可以让用户在不修改代码的情况下升级驱动, 或者修改驱动实现。 至于安装驱动这一操作,则可以通过在命令行里执行以下命令来完成: go get "github.com/lib/pq" 这一命令会从代码库中获取驱动的具体代码,并将这些代码放置到包库(packagerepository)里面,当需要用到这个驱动时,编译器就会把驱动代码与用户编写的代码一同编译。

2 创建帖子 func (post-post) Create() (err error) { statement :"insert into posts (content, author) values ($1,32) returning id " stmt, err :db.Prepare(statement) if err !- nil { return defer stmt.Close() (package repositcry err-stmt.QueryRow(post.Content,post.Author).Scan(Gpost.Id) 同编译。 return if err != nil (

return

3 获取一篇帖子 func GetPost(id int) (post Post, err error) { post -Post{) err= Db.QueryRow("select id, content, author from posts where id=$1",id).Scan(&post.Id, post.Content, &post.Author) return

4 更新帖子

func (post *Post) Update() (err error) { _,err = Db.Exec("update posts set content = 2,author=2, author =3 where id = -$1",post.Id, post.Content, post.Author) return }

5删除一篇帖子 func (post *Post) Delete()(err error) { _, err = Db.Exec("delete from posts where id - $1", post.id) return }