in gorm,管理几个mysql数据库名称的最佳方法是什么?

js5cn81o  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(376)

在我的用例中,每个用户都有一个数据库(我知道这不是最好的决定,但这是一个项目需求)。我想打开一个连接并更改每个查询的数据库名称。
我可以使用db.exec(“use clientdatabase;”);在执行每个查询之前更改数据库,但如果同时有另一个查询到达或正在执行,则可能会出现问题,因为所有应用程序都使用相同的数据库连接。
可能,我可以使用每个客户机/数据库的连接Map,Mapmax中的元素数并删除旧连接。
即使我可以为每个查询创建一个连接,但是如果一个客户机有几个查询,这可能是浪费时间。

rjee0c15

rjee0c151#

我找到了用不同的数据库名称重用相同连接的方法。我的解决方案是使用事务并在事务开始时设置数据库名称。以下带有输出的代码显示了一个示例:

//create transaction1 in nameDB = default
tx1 := DB.Begin()
var users1 []User
tx1.Find(&users1)
fmt.Println(users1[0].CreatedAt)

//create new transaction and change nameDB to seconddb
tx2 := DB.Begin()
tx2.Exec("use seconddb;")
var users2 []User
tx2.Find(&users2)
fmt.Println(users2[0].CreatedAt)
//close tx2 so, it teakes effect on DB
tx2.Commit()

//same query with transaction1 to show that we are in default bd
var users3 []User
tx1.Find(&users3)
fmt.Println(users3[0].CreatedAt)
tx1.Commit()

之后输出:

2018-05-25 12:25:12 +0200 CEST
2018-05-23 12:43:51 +0200 CEST
2018-05-25 12:25:12 +0200 CEST

如您所见,第一个和第三个输出对应于t1中日期为2018-05-25 12:25:12+0200 cest的“默认”数据库。第二个对应于t2中的“seconddb”数据库。

相关问题