peewee 表的有效仅插入权限

Effective insert-only permissions for peewee tables

我想知道使用 Peewee 对 postgres 数据库使用仅插入权限的最佳策略是什么。我想要这样做是为了确保特定用户无法从数据库中读回任何数据。

我在 postgres 中将 INSERT permissions 授予了我的 table、'test'。但是我 运行 遇到了一个问题,当我尝试使用类似以下内容保存新行时:

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

sql 实际上包含一个 RETURNING 子句,它需要比插入更多的权限(即 SELECT):

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

当我尝试使用 query = test.insert(value=1)' query.execute() 时,似乎生成了相同的 sql。

来看,您似乎需要授予 SELECT 权限,或者使用更奇特的功能,例如 Postgres 中的 "row level security"。开箱即用的 peewee 有什么办法可以解决这个问题吗?或者关于如何添加具有真正只写权限的新行的另一个建议?

您可以通过显式编写 INSERT 查询并提供空白 RETURNING 来省略返回子句。 Peewee 尽可能使用 RETURNING,以便可以在单个操作中恢复自动生成的 PK,但可以禁用它:

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

您还可以通过将数据库上的 returning_clause 属性设置为 False:

来为 all INSERT 操作覆盖此设置
db = PostgresqlDatabase(...)
db.returning_clause = False

虽然这不是官方支持的方法,并且可能会产生意想不到的副作用或奇怪的行为 - 买者自负。