1

Hello I would like to assign a dbConnection to a R6 class but it fails.

LastProfilZdb <- R6Class(
  classname = "LastProfilZdb",
    
  public = list(
    name = NULL,
    zp = NULL,
    data = NULL ,
    zp_id = function() {
      pool::poolWithTransaction(self$db_server, function(conn){
        DBI::dbGetQuery(conn, paste0("SELECT ZP_ID FROM 
                        ZP_ID WHERE LP_ZP = '", self$zaehlpunkt,
                        "' OR ZP_NAME_SAP = '", self$zaehlpunkt, "'"))
       })
    },
    #....
    #....
    initialize = function(){
      message("Init Data Base Connection")
      # 
      self$db_server <- pool::dbPool(drv = odbc::odbc(),
                                     dsn = "Oracle", 
                                     schema = "schema" )
    }, 
    finalize = function() {
      message("Closing Data Base Connection")
      pool::poolClose(self$db_server)
    }
    ),
   private = list(
        # db Connection is stored in the calss so we don't need to care any more
        # This way, input data can be collected in a neat way,
        # and stored inside our object.
        db_server = NULL
      )
    
   )


This fails with error: Error in self$db_server <- pool::dbPool(drv = odbc::odbc(), dsn = "Oracle", : cannot add bindings to a locked environment

What can I do?

  • Try using `private$db_server` to reference the private field. `self$db_server` will try to create a new entry in the public part of the class which it fails to do because R6 objects are locked environments by default. – Gregor de Cillia Jan 19 '22 at 12:56

0 Answers0