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
虽然这不是官方支持的方法,并且可能会产生意想不到的副作用或奇怪的行为 - 买者自负。
我想知道使用 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。
从
您可以通过显式编写 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
:
db = PostgresqlDatabase(...)
db.returning_clause = False
虽然这不是官方支持的方法,并且可能会产生意想不到的副作用或奇怪的行为 - 买者自负。