虽然我不知道SO法定人数会是什么,但问题本身很简单: 当你从R?
连接到数据库时,你们如何处理数据库连接字符串中的密码?教程经常会显示这样的例子。
con <- dbConnect(MySQL(), user="root", password="test",
dbname="research_db", host="localhost",
client.flag=CLIENT_MULTI_STATEMENTS)
如果数据库确实是您的实验性本地主机,这可能有些现实。但是,如果将其与服务器上的多个用户一起使用,则可能不希望像这样公开db凭据。特别是在将RStudio Server与SQL数据库结合使用时,您可能希望执行加密操作。你有什么经历?
答案 0 :(得分:9)
这是一段示例代码,它使用tcltk包来提示输入密码,同时隐藏实际值:
library(tcltk)
tt <- tktoplevel()
pass <- tclVar()
tkpack(tklabel(tt,text='Password:'))
tkpack(tkentry(tt,textvariable=pass,show='*'))
tkpack(tkbutton(tt,text="Done",command=function()tkdestroy(tt)))
tkwait.window(tt)
tclvalue(pass)
在这种情况下,它只是在最后打印出未隐藏的密码,但您可以将其包装在函数中以返回该值,然后将其用作密码参数的值。或者你可以在调用local
时调用此调用和连接调用(使用tclvalue行作为密码),以便包含密码的变量在使用后立即消失。
修改强>
对于RStudio和RStudio服务器,有一个函数.rs.askForPassword
。使用它像:
psswd <- .rs.askForPassword("Database Password:")
con <- dbConnect(MySQL(), user="root", password=psswd,
dbname="research_db", host="localhost",
client.flag=CLIENT_MULTI_STATEMENTS)
答案 1 :(得分:7)
所以我喜欢使用配置文件的解决方案 - 这是一个很好的答案。密码提示答案也有一些很好的评论,这使我得到了这个解决方案:
conn <- dbConnect(drv, "jdbc:sqlserver://host:port", 'username', password=.rs.askForPassword("Enter password:"))
答案 2 :(得分:6)
我对同一个问题有不同的解决方案,每次连接时都不需要用户输入密码。我正在使用.my.cnf文件功能。 基本上每个用户在其RStudio Server主目录的根目录中都有一个.my.cnf文件,其中包含所有MySQL数据库的密码,因此在R脚本中我只是通过“组”功能引用数据库。 / p>
R脚本:
library("RMySQL")
m <- dbDriver("MySQL")
# connect using .my.cnf
con <- dbConnect(m, group = "theDatabase")
.my.cnf文件:
[client]
user = userName
host = mysql.server.com
password = MyPassword
[theDatabase]
database = hr
[theDatabase2]
user = opto
database = opto
password = pure-light
host = merced
答案 3 :(得分:0)
使用Keyring软件包,您可以通过以下方式实现功能。
require(keyring)
require(RMySQL)
keyring::keyring_create("set_keyring_password_here") #Remember this password
keyring::key_set("dbname", keyring = "Your_set_keyring_password_here")
keyring::key_set("host", keyring = "Your_set_keyring_password_here")
keyring::key_set("port", keyring = "Your_set_keyring_password_here")
keyring::key_set("user", keyring = "Your_set_keyring_password_here")
keyring::key_set("pass", keyring = "Your_set_keyring_password_here")
keyring::key_set("unix.sock", keyring = "Your_set_keyring_password_here")
m<-MySQL() #set the driver to mysql check your database driver and edit
summary(m)
con<-dbConnect(m, dbname = keyring::key_get("dbname",
keyring = "Your_set_keyring_password_here"),
host=keyring::key_get("host",
keyring = "Your_set_keyring_password_here"),
port=as.numeric(keyring::key_get("port",
keyring = "Your_set_keyring_password_here")),
user=keyring::key_get("user",
keyring = "Your_set_keyring_password_here"),
pass=keyring::key_get("pass",
keyring = "Your_set_keyring_password_here"),
unix.sock=keyring::key_get("unix.sock",
keyring = "Your_set_keyring_password_here"),
)
keyring::keyring_lock("Your_set_keyring_password_here") #Lock keyring after using it.