引用一个函数内的开放数据库连接 - Golang [英] Referring to an open database connection inside a function - Golang

查看:138
本文介绍了引用一个函数内的开放数据库连接 - Golang的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的主函数打开一个数据库连接:

  func main(){$ b $ db,err:= sql .Open(sqlite3,./house.db)
checkErr(err)
$ b $ ...
}



然后,我想创建一个函数,允许我根据传递的结构向数据库添加一行:

  func addRow(row Room)error {
stmt,err:= db.Prepare(INSERT INTO Rooms(Name,Size,WindowCount,WallDecorationType, )
_,err = stmt.Exec(row.Name,row.Size,row.WindowCount,row.WallDecorationType,row.Floor)
return err
}

但显然我不能这样做,因为 addRow()函数不知道 db 是。



我将如何使这个功能起作用?或许我应该在主函数之外打开数据库?

解决方案

根据应用程序的工作方式, p>


  1. 保留 db 全局

  2. db 作为参数传递给
  3. make addRoom a 方法

我通常为API服务做的是创建一个 global db ,如下所示:

  var db * sql.DB 

func main(){
var err错误
db,err = sql.Open(sqlite3,./house.db)
checkErr(err)
//创建房间房间{}
err = addRoom(房间)
checkErr(err)
}

但是,您也可以将db作为参数传递

 func addRow(db * sql.DB,row Room)error 

或者你可以创建一个 struct ,它将连接保持为一个属性,并使 addRow 一个方法:

  type dbConn struct {
db * sql.DB
}

func(conn dbConn)addRow(row Room)error

book 有一些很好的例子。


My main function opens a database connection:

func main() {
    db, err := sql.Open("sqlite3", "./house.db")
    checkErr(err)

    ...
}

Then, I want to create a function that allows me to add a row to the database based on a passed struct:

func addRow(row Room) error {
    stmt, err := db.Prepare("INSERT INTO Rooms (Name, Size, WindowCount, WallDecorationType, Floor) VALUES(?, ?, ?, ?, ?)")
    _, err = stmt.Exec(row.Name , row.Size , row.WindowCount , row.WallDecorationType , row.Floor)
    return err
}

But obviously I can't do that because the addRow() function has no idea what db is.

How would I make this function work? Should I perhaps, open the database outside of the main function?

解决方案

Depending on how your application works, you can either

  1. keep the db global
  2. pass db as a parameter
  3. make addRoom a method

What I typically do for API services is create a global db, like this:

var db *sql.DB

func main() {
    var err error
    db, err = sql.Open("sqlite3", "./house.db")
    checkErr(err)
    // create room Room{}
    err = addRoom(room)
    checkErr(err)
}

But you can also pass db as a parameter:

func addRow(db *sql.DB, row Room) error

Or you can create a struct which keeps the connection as an attribute and makes addRow a method:

type dbConn struct {
    db *sql.DB
}

func (conn dbConn) addRow(row Room) error

This book has some nice examples.

这篇关于引用一个函数内的开放数据库连接 - Golang的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆