sqlalchemy psycopg2.errors.InsufficientPrivilege: разрешение запрещено для отношения <<table>> - PullRequest
0 голосов
/ 09 февраля 2020

Я прочитал более 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
);

прямо в 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>

Я также создал файл .htaccess в var/www/html с Header 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

кода, получающего 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)

, при выполнении этого кода получается исключение с этими ошибками

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

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

и

TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.

Любая помощь будет оценена

1 Ответ

0 голосов
/ 19 февраля 2020

Не уверен, что вы тестируете вручную с psql или pgAdmin, но убедитесь, что вы тестируете с той же учетной записью, которая использовалась в вашем коде.

Даже если у пользователя есть доступ к таблице / отношение в схеме, им также нужен доступ к самой схеме: grant usage on schema public to <myuser>

Также я заметил использование BIGSERIAL, которое включает последовательность. Вам, вероятно, понадобится grant usage on all sequences in schema public to <myuser>.

...