我可以将哪些参数传递给dbConnect?

Ric*_*ton 8 database-connection r

要连接到SQLite数据库,它是相当简单的:您传递驱动程序和SQLite文件的路径.

对于其他DBI兼容的数据库后端(PostgreSQL,MySQL等),您可以传递的dbConnect内容并不明显,也没有详细记录.

如何找出可以传递dbConnect给构建连接的内容?

Ric*_*ton 14

可用的参数取决于后端,这就是为什么dbConnect只显示驱动程序和...参数.

在我们开始之前,加载数据库连接(所需的软件包RSQLite,RPostgreSQL,RMySQL或其他).


找到驱动程序的名称

这应该与数据库后端的名称相同.当前支持的值包括 "SQLite","PostgreSQL","MySQL","Oracle","JDBC".

字符串必须始终是数据库包中函数的名称,因此如果有疑问,请搜索包(例如,使用ls("package:RSQLite"))并猜测看似合理的名称.


找到... args

您可以看到可用于连接的方法showMethods.

showMethods("dbConnect")
## Function: dbConnect (package DBI)
## drv="character"
## drv="PostgreSQLConnection"
## drv="PostgreSQLDriver"
## drv="SQLiteConnection"
## drv="SQLiteDriver"
Run Code Online (Sandbox Code Playgroud)

Driver在名称中获取适当后端的方法.

getMethod(dbConnect, "PostgreSQLDriver")
# The 'Method Definition' section of the output
## function (drv, ...) 
## postgresqlNewConnection(drv, ...)
Run Code Online (Sandbox Code Playgroud)

可用的参数是在前一个方法定义中调用的函数的参数.

?postgresqlNewConnection

args(postgresqlNewConnection)
## function (drv, user = "", password = "", host = "", dbname = "", 
##     port = "", tty = "", options = "", forceISOdate = TRUE) 
Run Code Online (Sandbox Code Playgroud)

SQLite和MySQL调用本地定义的函数,这是以编程方式访问的一点点痛苦.

?SQLite

args(body(getMethod("dbConnect", "SQLiteDriver"))[[2]][[3]])
## function (drv, dbname = "", ..., loadable.extensions = TRUE, 
## cache_size = NULL, synchronous = "off", flags = SQLITE_RWC, 
## vfs = NULL) 
## function (...)
Run Code Online (Sandbox Code Playgroud)

?MySQL

args(body(getMethod("dbConnect", "MySQLDriver"))[[2]][[3]])
## function (drv, dbname = NULL, username = NULL, password = NULL, 
## host = NULL, unix.socket = NULL, port = 0, client.flag = 0, 
## groups = "rs-dbi", default.file = NULL, ...
Run Code Online (Sandbox Code Playgroud)

OraSupport

# Oracle
args(.oci.Connect)
## function(drv, username = "", password = "", dbname = "", prefetch = FALSE, 
##     bulk_read = 1000L, stmt_cache = 0L, external_credentials = FALSE, 
##     sysdba = FALSE)
Run Code Online (Sandbox Code Playgroud)

RJDBC工作略有不同.它的dbConnect方法不是调用另一个子函数,而是接受额外的命名args.

formalArgs(getMethod(dbConnect, "JDBCDriver"))
## [1] "drv"      "url"      "user"     "password" "..."
Run Code Online (Sandbox Code Playgroud)