如何使用goLang执行sql文件

时间:2016-08-17 13:37:59

标签: database postgresql go

我有.sql文件,它有很多数据库创建,删除,填充内容。是否可以使用可以执行sql文件的go函数。我使用postgres作为我的数据库,并使用lib / pq驱动程序进行所有数据库事务。但是我在任何库中都可以在我的golang项目中执行这个sql文件。

6 个答案:

答案 0 :(得分:6)

我发现dotsql寻找类似的需求。您可以从特定文件加载命名的sql语句/ prepare语句并执行。

// Get a database handle
db, err := sql.Open("sqlite3", ":memory:")

// Loads queries from file
dot, err := dotsql.LoadFromFile("queries.sql")

// Run queries
res, err := dot.Exec(db, "create-users-table")
res, err := dot.Exec(db, "create-user", "User Name", "main@example.com")
rows, err := dot.Query(db, "find-users-by-email", "main@example.com")
row, err := dot.QueryRow(db, "find-one-user-by-email", "user@example.com")

stmt, err := dot.Prepare(db, "drop-users-table")
result, err := stmt.Exec()

请参阅:https://github.com/gchaincl/dotsql

答案 1 :(得分:5)

您可以将文件拆分为单独的请求并逐个执行:

file, err := ioutil.ReadAll("/path/to/file")

if err != nil {
    // handle error
}

requests := strings.Split(string(file), ";")

for _, request := range requests {
    result, err := db.Exec(request)
    // do whatever you need with result and error
}

答案 2 :(得分:3)

您可以使用os/exec标准库包。不需要数据库驱动程序。对于postgreSQL,代码看起来像这样:

cmd := exec.Command("psql", "-U", psqlUser, "-h", psqlHost, "-d", psqlDBName, "-a", "-f", sqlFilePath)

var out, stderr bytes.Buffer

cmd.Stdout = &out
cmd.Stderr = &stderr

err := cmd.Run()
if err != nil {
    log.Fatalf("Error executing query. Command Output: %+v\n: %+v, %v", out.String(), stderr.String(), err)
}

答案 3 :(得分:1)

如果要使用命令行来执行它,那就太麻烦了。您必须处理诸如设置密码,确保正确设置路径变量等问题。我认为最好的方法是使用数据库驱动程序,而仅使用Go进行调用。

在下面的示例中,我将pgx implementation of sql driver用于Postgres。您可以通过选择的任何驱动程序实现来实现。

path := filepath.Join("path", "to", "script.sql")

c, ioErr := ioutil.Readfile(path)
if ioErr != nil {
   // handle error.
}
sql := string(c)
_, err := *pgx.Conn.Exec(sql)
if err != nil {
  // handle error.
}

说明:

  1. 以与操作系统无关的方式获取sql脚本的路径。
  2. 将文件的内容读取为字符串。
  3. 使用sql驱动程序执行文件中的语句。

答案 4 :(得分:0)

在这里您有2个选择:

  1. 使用sql驱动程序连接到db并执行sql语句: 这里是使用附加事务的完整示例:

    j = i/2 + 1, ..., i - 1

用法:

func loadSQLFile(db *sqlx.DB, sqlFile string) error {
  file, err := ioutil.ReadFile(sqlFile)
  if err != nil {
      return err
  }
  tx, err := db.Begin()
  if err != nil {
      return err
  }
  defer func() {
     tx.Rollback()
  }()
  for _, q := range strings.Split(string(file), ";") {
      q := strings.TrimSpace(q)
      if q == "" {
         continue
      }
     if _, err := tx.Exec(q); err != nil {
         return err
     }
  }
  return tx.Commit()
}
  1. 通过执行bash命令的第二个选项:

    loadSQLFile(db, "data/my_file.sql")
    

用法:

func loadSQLFile(db, user, host, sqlFile string) error {
  cmd := exec.Command("psql", "-U", user, "-h", host, "-d", db, "-a", "-q", "-f", sqlFile)
  cmd.Stdout = os.Stdout
  cmd.Stderr = os.Stderr
  return cmd.Run()
}

虽然第二个选项看起来更简单,更简短,但我建议第一个选项,它可以让您更好地控制所做的事情,最重要的是,它更便于携带。

答案 5 :(得分:0)

这对我有用

func loadSqlFile(db *sqlx.DB) {
    // Read file
    file, err := ioutil.ReadFile("./test/mock.sql")
    if err != nil {
        fmt.Println(err.Error())
    }

    // Execute all
    _, err = db.Exec(string(file))
    if err != nil {
        fmt.Println(err.Error())
    }
}