Python和PostgreSQL:OperationalError:fe_sendauth:未提供密码

5

我知道在StackOverflow上有很多类似的问题,但我已经阅读并反复阅读了它们,似乎不能解决我的特定问题。

我正在开发一个Python应用程序,使用Peewee和Psycopg2来访问PostGresQL数据库。这一切都在Ubuntu Vagrant虚拟机中运行。

当我尝试通过Python添加用户时,我不断收到以下错误:

peewee.OperationalError: fe_sendauth: no password supplied

这是我尝试添加用户的代码:

def add_user(user, password):
    """
    :param username:
    :param password:
    :return:
    """
    try:
        #add user to admin user table
        #AdminUserModel.create(username=user, password=password)

        # add user to psql
        conn = connect_to_db('postgres', 'postgres')
        cursor = conn.cursor()
        add_query = "CREATE ROLE %s WITH CREATEDB LOGIN PASSWORD %s"
        add_data = (AsIs(user), password)
        cursor.execute(add_query, add_data)

    except IntegrityError:
        return False

    return True

def connect_to_db(db_name, username):
    conn = psycopg2.connect(dbname=db_name, user=username)
    conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
    return conn

我已经修改了我的pg_hba.conf文件,修改后的内容如下:

# Database administrative login by Unix domain socket
local   all             postgres                                trust

# "local" is for Unix domain socket connections only
local   all             all                                     md5

# IPv4 local connections:
host    all             vagrant         127.0.0.1/32            trust
host    all             all             127.0.0.1/32            md5

# IPv6 local connections:
host    all             vagrant         ::1/128                 trust
host    all             all             ::1/128                 md5

我已经重新启动了我的postgresql服务器。

以下是我的Vagrantfile文件:

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"

  config.vm.provider :virtualbox do |vb|
    # use for debugging the vm
    # vb.gui = true

    # speed up networking
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
  end

  config.vm.provision "shell", inline: <<-SHELL
    sudo apt-get update
    sudo apt-get install -y python-software-properties
    sudo apt-get update -y
    # sudo apt-get upgrade -y

    sudo apt-get install -y postgresql postgresql-contrib postgresql-client libpq-dev
    sudo sed -i "s/#listen_address.*/listen_addresses '*'/" /etc/postgresql/9.3/main/postgresql.conf
    sudo cp /home/vagrant/cs419-project/vagrant_files/pg_hba.conf /etc/postgresql/9.3/main/pg_hba.conf

    sudo service postgresql restart

    # createuser -U postgres -s vagrant
    sudo -u postgres psql -c "CREATE ROLE vagrant SUPERUSER LOGIN PASSWORD 'vagrant'"
    sudo su postgres -c "createdb -E UTF8 -T template0 --locale=en_US.utf8 -O vagrant cs419"

    sudo apt-get install -y python-pip python-psycopg2
    sudo pip install peewee
  SHELL

  config.vm.synced_folder ".", "/home/vagrant/cs419-project", id: "vagrant",
    owner: "vagrant",
    group: "admin",
    mount_options: ["dmode=775,fmode=664"]
end

任何您能提供的帮助都将不胜感激!

注意:最奇怪的部分是这似乎在之前都是有效的,但我不知道我改变了什么,它就停止工作了。


服务器正在向您的客户端请求密码,但您尚未提供密码。 - Craig Ringer
但是我正在使用“postgres”登录,它不需要密码。至少当我通过命令行连接时不需要密码... - Becky S
1
您的pg_hba.conf文件指定了除用户“vagrant”外,TCP连接需要密码。仅针对Unix套接字访问配置了“postgres”的无密码信任。 - Craig Ringer
2个回答

4

你可以尝试添加密码更改功能。

conn = psycopg2.connect(dbname=db_name, user=username)

变成这样?

conn = psycopg2.connect(dbname=db_name, user=username, password=password)

使用我的密码连接到postgres服务器,这对我有效。


如果我在pg_hba.conf上启用了用户postgres的对等访问权限,那该怎么办?我想使用sudo -u postgres来运行py文件。 - Shayan

3
在 pg_hba.conf 文件中为我们的 fe_sendauth 用户使用 "trust" 访问方法。

这是一种不好的方法。你只能在开发阶段使用它,在生产环境中你应该有一个密码。最好配置使密码被正确地使用和提供。 - Ville Myrskyneva
这显然是一个学生项目,旨在进行开发。 - coleifer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接