英文:
ent.go saying sql: databse is closed on any query
问题
db/db.go
文件中的DbClient
函数是用于创建数据库客户端的函数。它使用提供的配置信息来连接到PostgreSQL数据库,并返回一个ent.Client对象。
services/userservice.go
文件中的CreateUser
函数是用于创建用户的函数。它接受一个ent.Client对象和一个model.NewUser对象作为输入参数,并使用这些参数创建一个新的用户。
根据你提供的信息,当执行CreateUser
函数时,出现了sql: database is closed
的错误。这个错误通常是由于数据库连接已关闭导致的。可能的原因是在调用CreateUser
函数之前,数据库连接已经被关闭了。
你可以检查一下在调用CreateUser
函数之前是否有关闭数据库连接的代码。另外,你还可以确保在调用CreateUser
函数之前,数据库连接是处于打开状态的。
如果以上方法都没有解决问题,你可以提供更多的代码和错误信息,以便我能够更好地帮助你解决这个问题。
英文:
db/db.go
func DbClient(cfg *config.Config, logger log.Logger) *ent.Client {
// "host=<host> port=<port> user=<user> dbname=<database> password=<pass>"
psqlInfo := fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s",
cfg.DB_HOST, cfg.DB_PORT, cfg.DB_USER, cfg.DB_NAME, cfg.DB_PASS)
client, err := ent.Open("postgres", psqlInfo)
if err != nil {
logger.Fatal(err)
}
defer client.Close()
logger.Info("Database Connected")
if err := client.Schema.Create(context.Background()); !errors.Is(err, nil) {
logger.Fatalf("Error: failed creating schema resources %v\n", err)
}
return client
}
services/userservice.go
func CreateUser(client *ent.Client, input *model.NewUser) (*ent.User, error) {
user, err := client.Debug().User.Create().SetName(input.Name).SetUsername(input.Username).SetEmail(input.Email).SetPassword(input.Password).Save(context.Background())
if err != nil {
return &ent.User{}, err
}
return user, nil
}
ent client creating all necessary tables and showing database is connected.
But when I am executing CreateUser()
it is returning sql: database is closed
. Can anyone tell me why this is happening?
答案1
得分: 4
在你的引导代码中有一个数据库连接Close
调用:
func DbClient(cfg *config.Config, logger log.Logger) *ent.Client {
// "host=<host> port=<port> user=<user> dbname=<database> password=<pass>"
psqlInfo := fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s",
cfg.DB_HOST, cfg.DB_PORT, cfg.DB_USER, cfg.DB_NAME, cfg.DB_PASS)
client, err := ent.Open("postgres", psqlInfo)
if err != nil {
logger.Fatal(err)
}
defer client.Close() // <- 这里
logger.Info("Database Connected")
if err := client.Schema.Create(context.Background()); !errors.Is(err, nil) {
logger.Fatalf("Error: failed creating schema resources %v\n", err)
}
return client
}
这个调用在返回client
之后关闭连接。
如果需要关闭连接,请在CreateUser()
函数中关闭连接。
func CreateUser(client *ent.Client, input *model.NewUser) (*ent.User, error) {
user, err := client.Debug().User.Create().SetName(input.Name).SetUsername(input.Username).SetEmail(input.Email).SetPassword(input.Password).Save(context.Background())
if err != nil {
return &ent.User{}, err
}
defer client.Close() // <- 这里
return user, nil
}
英文:
There is a database connection Close
call in your bootstrap code:
func DbClient(cfg *config.Config, logger log.Logger) *ent.Client {
// "host=<host> port=<port> user=<user> dbname=<database> password=<pass>"
psqlInfo := fmt.Sprintf("host=%s port=%s user=%s dbname=%s password=%s",
cfg.DB_HOST, cfg.DB_PORT, cfg.DB_USER, cfg.DB_NAME, cfg.DB_PASS)
client, err := ent.Open("postgres", psqlInfo)
if err != nil {
logger.Fatal(err)
}
defer client.Close() // <- this one
logger.Info("Database Connected")
if err := client.Schema.Create(context.Background()); !errors.Is(err, nil) {
logger.Fatalf("Error: failed creating schema resources %v\n", err)
}
return client
}
This call close connection after returning client
.
If it necessary to close a connection, close it in from the CreateUser()
func.
func CreateUser(client *ent.Client, input *model.NewUser) (*ent.User, error) {
user, err := client.Debug().User.Create().SetName(input.Name).SetUsername(input.Username).SetEmail(input.Email).SetPassword(input.Password).Save(context.Background())
if err != nil {
return &ent.User{}, err
}
defer client.Close() // <- here
return user, nil
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论