使用 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 中,大多数命令分为两种类型:影响数据的操作查询(即 INSERT
、UPDATE
、DELETE
、DROP
) 或结果集查询 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
话虽如此,dbExecute
和 dbSendQuery
都应该 运行 任何类型的 SQL 语句,但它们的 return 值不同。根据包的风格(即 odbc
、ROracle
、RMySQL
、RPostgreSQL
),您可能需要使用 dbSendQuery
到 运行 操作语句特别适用于使用 dbBind
绑定参数。但是 dbExecute
永远不会 return 数据框!
您的Postgres-specific SET
语句是一个特殊操作查询。因此,只需调用 dbExecute
到 运行 并检索任何受影响的行。或者,调用 dbSendQuery
+ dbGetRowsAffected
+ dbClearResult
可能会获得与 dbExecute
.
相同的结果
我是通过 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 中,大多数命令分为两种类型:影响数据的操作查询(即 INSERT
、UPDATE
、DELETE
、DROP
) 或结果集查询 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
话虽如此,dbExecute
和 dbSendQuery
都应该 运行 任何类型的 SQL 语句,但它们的 return 值不同。根据包的风格(即 odbc
、ROracle
、RMySQL
、RPostgreSQL
),您可能需要使用 dbSendQuery
到 运行 操作语句特别适用于使用 dbBind
绑定参数。但是 dbExecute
永远不会 return 数据框!
您的Postgres-specific SET
语句是一个特殊操作查询。因此,只需调用 dbExecute
到 运行 并检索任何受影响的行。或者,调用 dbSendQuery
+ dbGetRowsAffected
+ dbClearResult
可能会获得与 dbExecute
.