我一直在尝试查找这段代码中的错误原因,但没有成功。我想将一个变量传递给 SQL,但它不断给出相同的错误。
MWE 如下(只需更改连接的
user
和 password
)。
library(DBI)
library(RMySQL)
library(tidyverse)
data("mtcars")
head(mtcars)
mtcars <- mtcars |>
rownames_to_column("type") |>
as_tibble()
# Open a connection to MySQL
conn <- dbConnect(MySQL(), user = "myuser", password = "mypassword")
# Create the appropriate database
dbGetQuery(conn, "CREATE DATABASE mtcars;")
dbGetQuery(conn, "USE mtcars")
# Query that doesn't work:
dbGetQuery(conn,
"SELECT COUNT(*) FROM mtcars WHERE cyl = ? ",
params = list(8))
这是我不断遇到的错误。
Error in .local(conn, statement, ...) :
unused argument (params = list(8))
我在帖子中看到过类似使用
\
或 \\
来逃避 ?
的想法,但它不起作用。我尝试过搜索类似的错误,但没有找到任何类似的内容。
感谢您给我的任何建议。
RMySQL
不支持params=
,作者(在其github repo上)说:
注意:该软件包正在逐步淘汰,取而代之的是新的
软件包。RMariaDB
首先,使用新包您的查询应该可以正常工作。 但是,我发现加载
RMySQL
首先会破坏一些东西。
Docker 镜像设置(因为我没有在任何地方运行 mysql):
docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8
在 R 中:
mysql <- DBI::dbConnect(RMySQL::MySQL(), user="root", password="my-secret-pw", host="127.0.0.1")
DBI::dbExecute(mysql, "create database quux")
# [1] 1
DBI::dbDisconnect(mysql)
# [1] TRUE
## maybe I don't need the double-connect for this?
mysql <- DBI::dbConnect(RMySQL::MySQL(), user="root", password="my-secret-pw", host="127.0.0.1", dbname="quux")
DBI::dbExecute(mysql, "create table quux (AA int, BB int)")
# [1] 0
DBI::dbExecute(mysql, "insert into quux (AA,BB) values (1,11), (2,22), (3,33)")
# [1] 3
DBI::dbGetQuery(mysql, "select * from quux where AA > 1")
# AA BB
# 1 2 22
# 2 3 33
DBI::dbGetQuery(mysql, "select * from quux where AA > ?", params=list(1))
# Error in .local(conn, statement, ...) :
# unused argument (params = list(1))
安装后
RMariaDB
,我尝试连接但得到
maria <- DBI::dbConnect(RMariaDB::MariaDB(), host="127.0.0.1", password="my-secret-pw", user="root", database="quux")
# Error in h(simpleError(msg, call)) :
# error in evaluating the argument 'statement' in selecting a method for function 'dbExecute': no slot of name "Id" for this object of class "MySQLConnection"
# Error in .local(dbObj, ...) :
# no slot of name "Id" for this object of class "MySQLConnection"
一时兴起,我启动了一个新的 R 会话并再次运行(这次没有错误),然后继续:
maria <- DBI::dbConnect(RMariaDB::MariaDB(), host="127.0.0.1", password="my-secret-pw", user="root", dbname="quux")
DBI::dbGetQuery(maria, "select * from quux where AA > 1")
# AA BB
# 1 2 22
# 2 3 33
DBI::dbGetQuery(maria, "select * from quux where AA > ?", params = list(1))
# AA BB
# 1 2 22
# 2 3 33
我不确定
Id
错误是一个错误还是只是有两个包确认与同一类型数据库的连接的细微差别。无论哪种方式,在新的 R 实例中,RMariaDB::MariaDB()
与 params=
一起使用(对于同一个 MySQL 数据库)。