由于权限问题,无法将Go代码连接到数据库(SQLSTATE 42501)

5us2dqdw  于 2023-05-27  发布在  Go
关注(0)|答案(1)|浏览(321)

由于权限问题,无法连接到数据库(SQLSTATE 42501)
这个docker容器有我的postgres镜像,运行得很好,我已经能够查看数据库,我有问题连接我的代码到数据库的权利没有。每当我运行的代码,它给出了错误

$ go run .
2023/05/23 10:01:02 failed to connect to `host=localhost user=postgres database=blogs`: server error (FATAL: could not open file "global/pg_filenode.map": Permission denied (SQLSTATE 42501))
exit status 1

我的db.go

package main

import (
    "database/sql"
    "log"

    _ "github.com/jackc/pgconn"
    _ "github.com/jackc/pgx/v4"
    _ "github.com/jackc/pgx/v4/stdlib"
)

func OpenDB(dsn string) (*sql.DB, error){
    db, err := sql.Open("pgx", dsn)
    if err != nil{
        return nil, err
    }

    err = db.Ping()
    if err != nil{
        return nil, err
    }

    return db, err
}

func (app *application) ConnectToDB() (*sql.DB, error){
    connection, err := OpenDB(app.DSN)
    if err != nil{
        return nil, err
    }

    log.Println("Connected to Posty!:-")
    return connection, nil
}

我的主,去吧

package main

import (
    "database/sql"
    "flag"
    "fmt"
    "log"
    "net/http"
)

const port = 8080

type application struct{
    Domain string
    DSN string
    DB *sql.DB
}

func main(){
    // set app config 
    var app application

    // read from command line
    flag.StringVar(&app.DSN, "dsn", "host=localhost port=5432 user=postgres password=postgres dbname=blogs sslmode=disable timezone=UTC connect_timeout=15", "Postgres Connection String")
    flag.Parse()

    //connect to the database
    conn, err := app.ConnectToDB()
    if err != nil{
        log.Fatal(err)
    }
    app.DB = conn

    app.Domain = "example.com"

    log.Println("Starting application on port", port)
 
    //start a web server
    err = http.ListenAndServe(fmt.Sprintf(":%d", port), app.routes())
    if err != nil{
        log.Fatal(err)
    }

}
bd1hkmkf

bd1hkmkf1#

global/pg_filenode.map是文件系统中的一个文件,数据库进程所有者需要访问该文件才能使数据库工作。如果它没有访问此文件的权限,则您的数据库已损坏。我不知道这是怎么发生的,大概是数据库之外的东西把它不应该做的事情搞砸了。解决这个问题可能很容易,只需将此文件的所有者/priv更改回它应该是什么,或者这可能是一些更深层次问题的症状。
我认为这是一个错误,这个错误被报告为42501。该代码应用于当数据库未能通过其内部权限系统时发生的错误,而这不是。这种情况应报告为以58或XX开头的错误。

相关问题