1
lifespy 2023-07-21 13:17:12 +08:00 via iPhone
一时之间我竟不知道如何回答你的问题。难道不能用 orm 吗
|
2
kuaner 2023-07-21 13:29:41 +08:00
os.exec()
|
3
jorneyr 2023-07-21 13:53:31 +08:00
这个方案在几个项目里用过了:
1. 复制一个 MongoDB 客户端程序到 go 程序目录下: 单个文件,50M 左右。 2. 在 go 程序里使用 exec.Command 执行调用 MongoDB 客户端执行脚本。 |
4
fy1206 OP @jorneyr 这个方案我有想过。我是看 mysql 的 driver 都有直接执行 sql 文件的方法,想着 mongo-driver 应该也有类似方法,但就是找不到。后来看到有个 RunCommand 的方法可以执行 sql ,但是需要转成 bson.D{}这种格式。
|
5
isexdpac 2023-07-21 14:38:23 +08:00
这种问题还有比 GPT 在行的吗。。
|
6
isexdpac 2023-07-21 14:39:15 +08:00
package main
import ( "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "io/ioutil" ) func main() { // 建立 MongoDB 会话,连接到数据库(同步代码) session, err := mgo.Dial("mongodb://localhost:27017") if err != nil { panic(err) } defer session.Close() session.SetMode(mgo.Monotonic, true) db := session.DB("your_database_name") // 读取脚本文件内容 script, err := ioutil.ReadFile("your_script_file.js") if err != nil { panic(err) } // 执行脚本文件 result := bson.M{} err = db.Run(bson.M{"eval": string(script)}, &result) if err != nil { panic(err) } // 处理脚本执行结果 // ... } 在上面的代码中,我们首先建立了一个 MongoDB 会话并连接到数据库。然后,我们使用 ioutil 包读取脚本文件的内容,并使用 db.Run 方法执行脚本文件。db.Run 方法的第一个参数是一个包含脚本的 bson.M 类型的 map ,键为"eval",值为脚本内容的字符串。第二个参数是用于接收脚本执行结果的变量。脚本执行结果通常是一个包含查询结果的 map 。 请注意替换上面代码中的 your_database_name 为你要连接的 MongoDB 数据库的名称,并将 your_script_file.js 替换为你要执行的脚本文件路径。 |
8
isexdpac 2023-07-21 17:01:46 +08:00
script.txt 脚本文件:
db.file.insertOne({"name":"test1","age":10}) db.file.insertOne({"name":"test2","age":11}) db.file.insertOne({"name":"test3","age":12}) db.file.find({name:"test2"}) 代码: package http import ( "context" "fmt" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "os" "strings" "testing" "time" ) func TestRunMongoFile(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() clientOptions := options.Client().ApplyURI("mongodb://admin:[email protected]:27017") client, err := mongo.Connect(ctx, clientOptions) if err != nil { t.Fatal(err) } err = client.Ping(ctx, nil) if err != nil { t.Fatal(err) } database := client.Database("test") fileContent, err := os.ReadFile("./script.txt") if err != nil { t.Fatal(err) } commands := strings.Split(string(fileContent), "\n") for _, cmd := range commands { if len(cmd) == 0 { continue } var result bson.M err = database.RunCommand(ctx, bson.D{{"eval", cmd}}).Decode(&result) if err != nil { t.Fatal(err) } fmt.Println(result) } } 我测试了下没啥问题,不知道是不是你要的效果,不过如果文件里执行 sql 多的话,context.WithTimeout 时间要改大一点 |