使用Golang如何导入/加载/运行MySQL文件

使用Golang如何导入/加载/运行MySQL文件 我正在尝试使用以下Go语句将SQL文件运行/加载到MySQL数据库中,但这不起作用:

exec.Command("mysql", "-u", "{username}", "-p{db password}", "{db name}", "<", file abs path )

但当我在Windows命令提示符中使用以下命令时,它运行得很好:

mysql -u {username} -p{db password} {db name} < {file abs path}

那么问题出在哪里?

3 回复

是的,你说得对。有人在 Stack Overflow 上用一个很好的方式问过我。

回答链接:https://stackoverflow.com/a/49303057/3858203

更多关于使用Golang如何导入/加载/运行MySQL文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


重定向 < 是 shell 的操作,但你并没有运行 shell。你可以打开文件并通过管道自行处理(参见 exec.Command 中的 Stdin 相关部分),或者你也可以将其编写为 shell 脚本来实现。

问题在于Go的exec.Command函数不支持shell重定向操作符(如<),因为它直接执行命令而不通过shell解释。在Windows命令提示符中,<是shell负责的重定向功能,但Go的exec.Command不会处理这个。

解决方案是使用MySQL客户端的source命令或通过标准输入传递文件内容。以下是两种方法的示例代码:

方法1:使用source命令

通过exec.Command执行MySQL客户端,并使用source命令加载SQL文件。这需要将命令作为参数传递给mysql可执行文件。

package main

import (
    "os/exec"
)

func main() {
    // 替换为实际参数
    username := "your_username"
    password := "your_password"
    dbName := "your_database"
    filePath := "C:/path/to/your/file.sql" // 使用正斜杠或转义反斜杠

    // 构建命令:mysql -u username -ppassword dbname -e "source filepath"
    cmd := exec.Command("mysql", "-u", username, "-p"+password, dbName, "-e", "source "+filePath)
    
    // 执行命令
    err := cmd.Run()
    if err != nil {
        panic(err) // 处理错误,例如文件不存在或MySQL连接失败
    }
}

方法2:通过标准输入重定向文件内容

使用exec.Command结合标准输入流,将文件内容传递给MySQL客户端。这模拟了shell的重定向行为。

package main

import (
    "os"
    "os/exec"
)

func main() {
    // 替换为实际参数
    username := "your_username"
    password := "your_password"
    dbName := "your_database"
    filePath := "C:/path/to/your/file.sql" // 使用正斜杠或转义反斜杠

    // 打开SQL文件
    file, err := os.Open(filePath)
    if err != nil {
        panic(err) // 处理文件打开错误
    }
    defer file.Close()

    // 构建命令:mysql -u username -ppassword dbname
    cmd := exec.Command("mysql", "-u", username, "-p"+password, dbName)
    cmd.Stdin = file // 将文件设置为标准输入
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    // 执行命令
    err = cmd.Run()
    if err != nil {
        panic(err) // 处理执行错误
    }
}

说明:

  • 在方法1中,-e选项允许直接执行SQL命令,这里使用source命令来加载文件。
  • 在方法2中,通过设置cmd.Stdin为打开的文件,MySQL客户端会从文件中读取内容。
  • 确保文件路径使用正斜杠(/)或转义反斜杠(\\),例如C:\\path\\to\\file.sql,以避免转义问题。
  • 如果MySQL客户端不在系统PATH中,可能需要提供完整路径,例如C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql.exe

选择其中一种方法即可解决问题。如果遇到权限或路径错误,请检查文件路径和MySQL凭据。

回到顶部