我正试图为其他数据科学家和数据分析人员构建我们的数据库连接样板编码的内部工具的参考实现。
我们的软件开发人员在python中做了类似的事情:
class DataRepository:
def __init__(self):
if user is not None and account is not None and password is not None and warehouse is not None and role is not None and database is not None and schema is not None:
self.ctx = snowflake.connector.connect(
user=user,
password=password,
account=account,
role=role,
database=database,
schema=schema,
warehouse=warehouse,
login_timeout=login_timeout,
ocsp_fail_open=ocsp_fail_open
)
else:
secret_str = self.get_secrets()
self.ctx = snowflake.connector.connect(
user=secret_str['user'],
password=secret_str['password'],
account=secret_str['account'],
role=secret_str['role'],
database=secret_str['database'],
schema=secret_str['schema'],
warehouse=secret_str['warehouse'],
login_timeout=login_timeout,
ocsp_fail_open=ocsp_fail_open
)
def get_secrets(self):
my_session = boto3.session.Session(region_name=AWS_DEFAULT_REGION)
client = my_session.client(
service_name='secretsmanager',
region_name=AWS_DEFAULT_REGION,
)
get_secret_value_response = client.get_secret_value(
SecretId=SECRET_NAME
)
secret_str = json.loads(get_secret_value_response['SecretString'])
return secret_str我试图用S3将其复制为:
DataRepository <-
R6Class(
classname = "DataRepository",
public = list(
ctx = NULL,
secrets = NULL,
initialize = function() {
if (length(user) == 1 &
length(account) == 1 & length(password) == 1
&
length(warehouse) == 1 &
length(role) == 1 & length(database) == 1) {
self$ctx <- dbConnect(
odbc::odbc(),
Driver = "SnowflakeDSIIDriver",
Database = database,
Uid = user,
Pwd = password,
Server = paste0(account, ".snowflakecomputing.com"),
role = role
)
} else {
secret_dict <- self$getSecrets()
self$ctx <- dbConnect(
odbc::odbc(),
Driver = secret_dict$user,
Database = secret_dict$database,
Uid = secret_dict$user,
Pwd = secret_dict$password,
Server = paste0(secret_dict$account, ".snowflakecomputing.com"),
role = secret_dict$account
)
}
},
getSecrets = function() {
secrets_client <- paws::secretsmanager(config =
list(region = AWS_REGION))
get_secret_value_response <- secrets_client$get_secret_value(SecretId = SECRETS_NAME)
secrets_str <-
get_secret_value_response$SecretString %>% fromJSON()
return(secrets_str)
}
)
)但是,我似乎无法像我同事在python中那样访问初始化器中的get_secrets函数。
有什么简单的解决办法吗?
PS:我对R6系统不太熟悉,我相信我的困惑可能是由于概念上的错误,但我很乐意了解更多:)
发布于 2021-03-20 20:41:48
您的代码在getSecrets方面很好,但是您忘记了定义构造函数参数。
考虑到这一点:
DataRepository <-
R6Class(
classname = "DataRepository",
public = list(
ctx = NULL,
secrets = NULL,
initialize = function(user, account,password,warehouse,role,database) {
if ( !missing(database) &&
length(user) == 1 &&
length(account) == 1 && length(password) == 1 &&
length(warehouse) == 1 &&
length(role) == 1 && length(database) == 1) {
self$ctx <- dbConnect(
odbc::odbc(),
Driver = "SnowflakeDSIIDriver",
Database = database,
Uid = user,
Pwd = password,
Server = paste0(account, ".snowflakecomputing.com"),
role = role
)
} else {
secret_dict <- self$getSecrets()
## self$ctx <- dbConnect(
## odbc::odbc(),
## Driver = secret_dict$user,
## Database = secret_dict$database,
## Uid = secret_dict$user,
## Pwd = secret_dict$password,
## Server = paste0(secret_dict$account, ".snowflakecomputing.com"),
## role = secret_dict$account
## )
}
},
getSecrets = function() {
cat( "I am in the getSecrets method!\n")
## secrets_client <- paws::secretsmanager(config =
## list(region = AWS_REGION))
## get_secret_value_response <- secrets_client$get_secret_value(SecretId = SECRETS_NAME)
## secrets_str <-
## get_secret_value_response$SecretString %>% fromJSON()
## return(secrets_str)
}
)
)
dr = DataRepository$new()输出:
> dr = DataRepository$new()
I am in the getSecrets method!检查您的参数是否丢失(上面我只检查了最后一个参数,如果您只执行位置参数,这是没有保证的),或者设置您有意义地处理的默认值,或者只编写一个函数,检查输入参数并返回FALSE,如果这些参数不够,您应该去获取它们的秘密。
也要使用双安培,例如。&&而不是&,后者是一个矢量化的运算符。您在这里应该只有一个值,如果wisn不是这样的话,您将欢迎发出警告。
https://stackoverflow.com/questions/66563146
复制相似问题