Эффективные разрешения только на вставку для таблиц peewee - PullRequest
0 голосов
/ 18 января 2020

Мне интересно, какова лучшая стратегия использования разрешений на вставку только для postgres db с Peewee. Я хотел бы это, чтобы быть уверенным, что конкретный пользователь c не может прочитать какие-либо данные из базы данных.

Я предоставил INSERT разрешения для моей таблицы ' test ', в postgres. Но я столкнулся с проблемой, что когда я пытаюсь сохранить новые строки с чем-то вроде:

thing =  Test(value=1)
thing.save()

sql на самом деле содержит предложение RETURNING, которому нужно больше разрешений (а именно SELECT), чем просто вставить :

INSERT INTO "test" ("value") VALUES (1) RETURNING "test"."id"

Похоже, то же самое sql генерируется, когда я пытаюсь также использовать query = test.insert(value=1)' query.execute().

При взгляде вокруг кажется, что вы Вам нужно либо предоставить привилегии SELECT, либо использовать функцию exoti c, такую ​​как «защита на уровне строк» ​​в Postgres. Есть ли способ go об этом с peewee из коробки? Или другое предложение о том, как добавлять новые строки с правами доступа только для записи?

1 Ответ

1 голос
/ 19 января 2020

Вы можете опустить возвращающее предложение, явно написав запрос INSERT и предоставив пустое ВОЗВРАТ. Peewee использует RETURNING, когда это возможно, чтобы автоматически сгенерированный PK можно было восстановить за одну операцию, но его можно отключить:

# Empty call to returning will disable the RETURNING clause:
iq = Test.insert(value=1).returning()
iq.execute()

Вы также можете переопределить это для all Вставьте операции, установив для атрибута returning_clause в БД значение False:

db = PostgresqlDatabase(...)
db.returning_clause = False

Хотя это официально не поддерживаемый подход и может иметь непредвиденные побочные эффекты или странное поведение - caveat emptor.

...