sqlalchemy psycopg2.errors.InsufficientPrivilege:关系 <<table>> 的权限被拒绝

Kuk*_*ula 17 python postgresql permissions sqlalchemy

我已经阅读了 20 多个关于同一问题的不同问题 - 并且建议的答案并没有解决我的问题。我还在得到sqlalchemy psycopg2.errors.InsufficientPrivilege: permission denied for relation <<table>>

环境:EC2、debian 8、postgresql、flask、sqlalchemy 我在 postgresql 中的表:

Create table Members(
id BIGSERIAL PRIMARY KEY,
joinDate TIMESTAMPTZ DEFAULT Now(),
password TEXT NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

直接在 postgresql 中:INSERT INTO members (password) VALUES('123') RETURNING id;完美运行

我已授予我的用户所有可能的授权

grant all privileges on database <my_db> to <my_user>
grant all privileges on all table in schema public to <my_user>
grant all privileges on all relations in schema public to <my_user>
Run Code Online (Sandbox Code Playgroud)

我还在下面创建了一个.htaccess文件var/www/htmlHeader set Access-Control-Allow-Origin "*"

我的表用 sqlalchemy 映射member.py

from datetime import datetime
from sqlalchemy import create_engine, Column, String, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from marshmallow import Schema, fields
from sqlalchemy.schema import UniqueConstraint
import sqlalchemy as sa

Engine = create_engine('postgresql://<my_user>:<my_psw>@<my_db_url>/<my_dn_name>')
Session = sessionmaker(bind=Engine)
Base = declarative_base()

class MemberSchema(Schema):
    id = fields.Number()    
    password = fields.Str()

class Member(Base):
    __tablename__ = 'members'

    id = Column(Integer, primary_key=True)
    password = Column(String)

    def __init__(self, password):
        self.password = password
Run Code Online (Sandbox Code Playgroud)

接收 POST 并执行插入操作的代码test.py

from flask import Flask, render_template, request,jsonify
from flask_cors import CORS, cross_origin
import logging

def register_member(password):
    session = Session()
    newMember = Member(password)
    session.add(newMember)
    session.commit()
    return newMember

app = Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'

@app.route("/register", methods=["GET", "POST"])
@cross_origin()    
def register():
    try:
        formData = request.form
        register_member(formData['password'])
        return jsonify({"message":"Regsitrated successfully!"})
    except Exception as ex:
        logging.debug(ex)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=1234, debug=True)
Run Code Online (Sandbox Code Playgroud)

执行此代码会导致异常并出现这些错误

DEBUG:root:(psycopg2.errors.InsufficientPrivilege) permission denied for relation members

[SQL: INSERT INTO members (password) VALUES (%(password)s) RETURNING members.id]
[parameters: {'password': '4444'}]
Run Code Online (Sandbox Code Playgroud)

TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

Ed *_*pel 13

不确定您是否使用psql或进行手动测试pgAdmin,但请确保您使用代码中使用的相同帐户进行测试。

即使用户有权访问模式中的表/关系,他们也需要访问模式本身: grant usage on schema public to <myuser>

另外,我注意到BIGSERIAL它的使用涉及一个序列。您可能需要一个grant usage on all sequences in schema public to <myuser>.


Art*_*sov 8

PostgreSQL 数据库中似乎有多层权限。如果一层缺少权限,查询就会失败。

  1. 数据库:GRANT ALL PRIVILEGES ON DATABASE thedatabse TO theotheruser;
  2. 每个架构
  3. 每桌
  4. 每个序列

对于第 2-4 层,它取决于数据库的结构,但无论结构如何,都将涉及大量键入和/或单击以更改每个层中每个项目的权限或复杂的查询。