使用 RMySQL 将参数传递给 SQL 时出错

问题描述 投票:0回答:1

我一直在尝试查找这段代码中的错误原因,但没有成功。我想将一个变量传递给 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))

我在帖子中看到过类似使用

\
\\
来逃避
?
的想法,但它不起作用。我尝试过搜索类似的错误,但没有找到任何类似的内容。

感谢您给我的任何建议。

r dbi rmysql
1个回答
0
投票

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 数据库)。

© www.soinside.com 2019 - 2024. All rights reserved.