首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rmarkdown/quarto文档中的数据库查询在R块中工作,但在sql块中失败

rmarkdown/quarto文档中的数据库查询在R块中工作,但在sql块中失败
EN

Stack Overflow用户
提问于 2022-08-23 16:34:02
回答 2查看 283关注 0票数 1

我工作在一个rmarkdown / quarto文档查询数据库(Exasol)与只读访问。如果在R块中执行,这很好,如下所示。

代码语言:javascript
复制
```{r} 

conn <- exasol::dbConnect( drv = "exa",exahost = "my_host_url",

代码语言:javascript
复制
      uid = Sys.getenv("EXASOL_USER"), pwd = Sys.getenv("EXASOL_PWD") )

查询<-“从MY_SCHEMA.MY_TABLE限制10中选择*”

df <- exasol::dbGetQuery(conn,query)

代码语言:javascript
复制

现在,我尝试在sql块中运行相同的查询。

代码语言:javascript
复制
```{sql connection=conn}

从MY_SCHEMA.MY_TABLE限制10中选择*

代码语言:javascript
复制

但是,我得到以下错误消息。

代码语言:javascript
复制
Using Schema from statement: "MY_SCHEMA"
Transaction rolled back.
Error in exa.readData(res$connection, query, ...) : 
  Could not receive header
In addition: Warning message:
In .EXAExecStatement(con = conn, stmt = statement, schema = schema,  :
  42500 -6818256 [EXASOL][EXASolution driver]insufficient privileges for creating table (Session: 1741969101333790720)[RODBC] ERROR: Could not SQLExecDirect 'create table "SUS_ANALYTICS".TEMP_791648_CREATED_BY_R as (SELECT * FROM MY_SCHEMA.MY_TABLE LIMIT 10
)'
Error in exa.readData(res$connection, query, ...) : 
  Could not execute SQL: '42000' -6811776' [EXASOL][EXASolution driver]object "MY_SCHEMA"."TEMP_791648_CREATED_BY_R" not found [line 1, column 23] (Session: 1741969101333790720)'
Failed to execute SQL chunk

我只读访问权限。因此,关键的信息似乎是insufficient privileges for creating table。它显示引擎试图创建一个临时表,但失败。

  • 为什么会发生这种情况,因为R块工作时没有这些问题?
  • 而且,更重要的是:有办法使sql块工作吗? :)

PS。对不起,我不知道如何使这个例子重现。

EN

回答 2

Stack Overflow用户

发布于 2022-09-01 15:18:21

正如注释和其他答案中已经描述的那样,这个问题是由Exasol在使用DBI::dbSendQuery时试图创建一个表引起的。然而,有一个简单的解决办法。只需设置sql块参数max.print = -1即可。这将导致针织品sql引擎使用DBI::dbGetQuery而不是DBI::dbSendQuery。由于DBI::dbGetQuery不尝试创建(临时)表,因此问题被回避。

示例

代码语言:javascript
复制
```{sql connection=conn, max.print=-1}

从MY_SCHEMA.MY_TABLE限制10中选择*

代码语言:javascript
复制

为什么?

以下代码来自第616行ff。编织机的

代码语言:javascript
复制
  data = tryCatch({
    if (is_sql_update_query(query)) {
      DBI::dbExecute(conn, query)
      NULL
    } else if (is.null(varname) && max.print > 0) {
      # execute query -- when we are printing with an enforced max.print we
      # use dbFetch so as to only pull down the required number of records
      res = DBI::dbSendQuery(conn, query)
      data = DBI::dbFetch(res, n = max.print)
      DBI::dbClearResult(res)
      data

    } else {
      if (length(params) == 0) {
        DBI::dbGetQuery(conn, query)
      } else {
        # If params option is provided, parameters are not interplolated
        DBI::dbGetQuery(conn, sql, params = params)
      }
    }
    ...

第一个else if语句是相关的部分:如果您将max.print设置为等于或小于0的值,则它将是DBI::dbGetQuery而不是DBI::dbSendQuery

票数 2
EN

Stack Overflow用户

发布于 2022-08-24 13:33:30

西琳是对的。目前,r-exasol需要创建临时表来实现DBI接口的分页。这样,您就需要使用写权限来运行sql块。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73462252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档