DBI 语句进行错误,在闪亮的反应式环境中

DBI statement in progress error, in a Shiny Reactive Environment

提问人:user49017 提问时间:7/4/2023 最后编辑:jpsmithuser49017 更新时间:7/16/2023 访问量:56

问:

我在 Amazon SageMaker 上的 RStudio 中有一个闪亮的应用程序。我将应用程序连接到 Redshift 上的两个数据库(一个包含客户地址,另一个包含客户 ID)。

在我的 中,有一个条件面板,用户可以在其中按客户 ID 或客户地址进行搜索。根据所选的选项,用户还会获得提交 ID 或地址,并将查询发送到相应的表。uitextInput(inputId ="cid")textInput(inputId ="cad")actionButtonactionButton("go_cid")actionButton("go_cad")

我的连接有效,如下所示:

con_cad <- dbConnect(odbc::odbc(),
Driver='redshift', 
Server='***********.redshift.amazonaws.com', 
Port='5439', 
Database='*******', 
UID='****************', 
PWD= '**************')
con_cid <- dbConnect(odbc::odbc(),
Driver='redshift', 
Server='***********.redshift.amazonaws.com', 
Port='5439', 
Database='*******', 
UID='****************', 
PWD= '**************')

在“我想查询地址”或“ID”表中,具体取决于用户选择。无论哪种方式,我都会将查询结果保存在相应的数据帧中,以便在以后的计算中使用。server

假设用户选择按地址搜索。我希望创建一个具有与输入地址匹配的地址的反应式数据帧。我的代码下面的代码实现了这一点:

df_cad <- eventReactive(input$go_cad,{
qry_cad <- dbSendQuery(con_cad, paste0("SELECT * FROM customer_ad WHERE address = '" , toupper(input$cad) , "'")) 
cad_result <- dbFetch(qry_cad , n =3) 
onStop(function(){dbClearResult(qry_cad) }) 
cad_result
})

当我第一次在应用程序中搜索地址时,一切正常。但是,当应用程序运行时,当我搜索第二个地址(或第二次搜索同一地址)时,出现以下错误。

Error: nanodbc/nanodbc.cpp:1509: 00000: [RStudio][Amazon Redshift] (140) Error occurred while trying to run statement: a statement is already in progress 

请注意,该应用程序的结构使得 redshift 连接位于我的脚本之上,后跟 和 .我试图将连接放在反应式环境中,但这也没有用。uiserver

如果有人能帮我解决这个问题,我会很高兴。 谢谢

闪亮 的亚马逊-Redshift RODBC R-DBI

评论


答:

0赞 user49017 7/16/2023 #1

我能够通过使用软件包来管理连接来解决这个问题。pool

pool_cad <- pool::dbPool(drv = odbc::odbc(), 
                         Driver='redshift',
                         Database= '******', 
                         Port='5439',
                         Server = '*******.redshift.amazonaws.com',
                         UID = '*******',
                         PWD = '*******')
df_cad <- eventReactive(input$go_cad,{
    
    qry_cad <- "SELECT * FROM FROM customer_ad WHERE address =?addr;"
    sql_cad_statement <- sqlInterpolate(pool_cad, qry_cad, addr = toupper(input$cad) )
    dbGetQuery(pool_cad, sql_cad_statement)
    })