使用 RPostgres,我应该使用什么来 "set role..." 作为 table 我将写入数据库?

Using RPostgres, what should I use to "set role..." for the table I will write to a db?

我是通过 R 连接到数据库的新手,我正在努力寻找最佳实践来最大程度地减少错误和问题。我正在将 table 从 R 上传到 postgres 数据库,我需要将权限设置为某个我知道其名称的组。

我正在尝试找出各种 DBI 功能的不同行为和最佳实践,以免我不小心犯错并弄乱数据库。

我不知道我应该使用 dbExecute() 还是 dbSendQuery()。我已经阅读了这两个函数的 R 文档,并了解到它们执行 sql 命令来修改连接的数据库。我知道 dbExecute() 告诉我受影响的行数,但 dbSendQuery() 似乎也是。 dbExecute() 似乎使用了 dbSendStatement(),但这并不能帮助我理解差异,因为它看起来很相似。

我无法解释我在下面这两个示例中看到的行为。他们都在做同样的事情吗?他们都在工作吗?一种方法比另一种更好或更安全吗?

示例 1

res <- dbExecute(con,'set role certain_group')
print(res)          # output is: [1] 0
dbClearResult(res)  # output is: Error in (function (classes, fdef, mtable)  : 
#  unable to find an inherited method for function ‘dbClearResult’ for signature ‘"integer"’

示例 2

res2 <- dbSendQuery(con,'set role certain_group')
print(res2)         # output is: <PqResult>
  SQL  set role certain_group
  ROWS Fetched: 0 [complete]
       Changed: 0
dbClearResult(res)  # no output in console

最后说明:与其他选项相比,我更喜欢使用 RPostgres 包。

在 SQL 中,大多数命令分为两种类型:影响数据的操作查询(即 INSERTUPDATEDELETEDROP ) 或结果集查询 return 数据(即 SELECT)。

在 R 的 DBI 中,不同的方法根据文档触发这两种类型的命令:

  • dbExecute主要用于动作查询,实际上是对dbSendStatement+dbGetRowsAffected+dbClearResult的包装。根据文档:

dbExecute: Execute an update statement, query number of rows affected, and then close result set

  • dbGetQuery 主要用于将结果迁移到数据框的结果集查询,实际上是 dbSendQuery + dbFetch + dbClearResult 的包装器。根据文档:

dbGetQuery: Send query, retrieve results and then clear result set

话虽如此,dbExecutedbSendQuery 都应该 运行 任何类型的 SQL 语句,但它们的 return 值不同。根据包的风格(即 odbcROracleRMySQLRPostgreSQL),您可能需要使用 dbSendQuery 到 运行 操作语句特别适用于使用 dbBind 绑定参数。但是 dbExecute 永远不会 return 数据框!

您的Postgres-specific SET 语句是一个特殊操作查询。因此,只需调用 dbExecute 到 运行 并检索任何受影响的行。或者,调用 dbSendQuery + dbGetRowsAffected + dbClearResult 可能会获得与 dbExecute.

相同的结果