我有.sql文件,它有很多数据库创建,删除,填充内容。是否可以使用可以执行sql文件的go函数。我使用postgres作为我的数据库,并使用lib / pq驱动程序进行所有数据库事务。但是我在任何库中都可以在我的golang项目中执行这个sql文件。
答案 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()
答案 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.
}
说明:
答案 4 :(得分:0)
使用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()
}
通过执行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())
}
}