我有一个非常简单的问题,会产生错误。示例将清除这一点。
library(odbc)
library(DBI)
library(dplyr)
library(dbplyr)
con <- dbConnect(odbc(), "myDSN")
tbl_test <- tibble(ID = c("A", "A", "A", "B", "B", "B"),
val = c(1, 2, 3, 4, 5, 6),
cond = c("H", "H", "A", "A", "A", "H"))
dbWriteTable(con, "tbl_test", tbl_test, overwrite = TRUE)
Run Code Online (Sandbox Code Playgroud)
将简单表写入数据库后,我在 db 中添加到表的链接,并尝试使用正常工作的简单条件总和。但是会遇到错误。
db_tbl <- tbl(con, in_schema("dbo", "tbl_test"))
db_tbl %>%
group_by(ID) %>%
summarise(sum = sum(val, na.rm = TRUE),
count_cond = sum(cond == "H", na.rm=TRUE),
sum_cond = sum(val == "H", na.rm=TRUE))
Error: <SQL> 'SELECT TOP 10 "ID", SUM("val") AS "sum", …Run Code Online (Sandbox Code Playgroud) 我最近在计算机上安装了MySQL,并尝试将RStudio连接到MySQL。我按照书中的说明以及此处的说明进行操作。但是,无论何时使用dbConnect()或src_mysql在中RStudio,我都会收到以下错误消息:
Error in .local(drv, ...) :
Failed to connect to database: Error: Plugin caching_sha2_password could not be loaded: The specified module could not be found
Run Code Online (Sandbox Code Playgroud)
例如,我可能会在Windows中使用命令提示符登录到MySQL
mysql -u username -p
并如下创建数据库
CREATE DATABASE myDatabase;
然后在RStudio中:
library(RMySQL)
db <- dbConnect(MySQL(), dbname = "myDatabase", user = "username",
password = "password", host = "localhost")
Run Code Online (Sandbox Code Playgroud)
而我的回应始终是上面列出的错误消息。
如果需要的话:
sessionInfo()
R version 3.5.2 (2018-12-20)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Run Code Online (Sandbox Code Playgroud) 我在R中有一个数据框,其中包含先前查询的输出.不幸的是,我无法直接在SQL中执行此操作,因为它太慢,因此我使用的是data.table包.data.table包的输出是50,000个数据帧.我需要从数据库中提取每个id的所有记录.
# x is a dataframe containing 50,000 ids.
Run Code Online (Sandbox Code Playgroud)
通常,我会做类似的事情,
dbGetQuery(con, "Select * from data where id in x")
Run Code Online (Sandbox Code Playgroud)
但那不行.另一种方法是在for循环中执行50,000个查询,但我认为必须有一个更有效的方法来执行此操作.
最有效的方法是什么?
DBI 包中是否有一个函数可以获取有关数据库架构的信息?
我正在使用 DBI 包和 odbc 驱动程序连接到 SQL Server。这些dbListTables函数允许使用schema参数显示特定模式中的表,但我找不到查询存在哪些模式的方法。
只是想知道是否可以使用 DBI 将参数传递给 SQL 查询 IN 子句?已尝试以下(以及许多变体,包括未命名参数)
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "iris", iris)
iris_result <- dbSendQuery(con, "SELECT * FROM iris WHERE [Petal.Width] > $PW and [Petal.Length] in ($PL)")
dbBind(iris_result, list(PW=2.3, PL={6.0, 5.1}))
dbFetch(iris_result)
Run Code Online (Sandbox Code Playgroud)
这个链接,参数化查询,展示了一种使用glue包的方法,但是,我想知道是否可以只使用DBI。
谢谢。
注意,作为参考,这里是使用胶水的方法:
rs_sql <- glue_sql("SELECT * FROM iris WHERE [Petal.Width] > {pwin} and [Petal.Length] IN ({lengths*})",
pwin = 2.3, lengths = c(6.0, 5.1),
.con = con
)
iris_result <- dbSendQuery(con, rs_sql)
dbFetch(iris_result)
rs_sql <- glue_sql("SELECT * FROM iris WHERE [Petal.Width] > {pwin} and …Run Code Online (Sandbox Code Playgroud) 我有一个 50GB SQLite 数据库文件,我想计算并添加新变量。您可以利用Moody_Mudskipper 的功能或使用ALTER TABLE 和 UPDATE 的功能来创建变量而不是整个表吗?
library(dbplyr)
library(DBI)
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, head(iris,3),"iris")
create <- function(data,name){
DBI::dbSendQuery(data$src$con,
paste("CREATE TABLE", name,"AS", dbplyr::sql_render(data)))
}
tbl(con,"iris") %>%
mutate(Sepal.Area= Sepal.Length * Sepal.Width) %>%
create("iris_2")
Run Code Online (Sandbox Code Playgroud) 我正在构建一个用于内部使用的包,并试图从用户中抽象出所有可能的数据库交互.我需要连接到数据库并断开与函数内的数据库的连接(我认为).但是,断开连接不起作用.
`my_func = function(){
con = DBI::dbConnect(RSQLite::SQLite(), 'db_location.sqlite')
r = DBI::dbSendQuery("SELECT * ...")
dat = DBI::dbFetch(r)
DBI::dbDisconnect(con)
return(dat)
}`
Run Code Online (Sandbox Code Playgroud)
如果你调用这个函数:
MY_LIBRARY::my_func()
返回数据但连接未终止并显示警告.
`Warning message:
In connection_release(conn@ptr) :
There are 1 result in use. The connection will be released when
they are closed`
Run Code Online (Sandbox Code Playgroud) 我有这个函数,我曾经加载SQLite表
sqLiteConnect <- function(database, table) {
library(DBI)
library(RSQLite)
con <- dbConnect("SQLite", dbname = database)
query <- dbSendQuery(con, paste("SELECT * FROM ", table, ";", sep=""))
result <- fetch(query, n = -1, encoding="utf-8")
dbClearResult(query)
dbDisconnect(con)
return(result)
}
Run Code Online (Sandbox Code Playgroud)
但现在它接缝会产生错误
album <- sqLiteConnect("~/Downloads/ChinookDatabase1.3_Sqlite/Chinook_Sqlite.sqlite","Album")
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘dbConnect’ for signature ‘"character"’
Called from: stop(gettextf("unable to find an inherited method for function %s for signature %s",
sQuote(fdef@generic), sQuote(cnames)), domain = NA)
Run Code Online (Sandbox Code Playgroud)
(我从这里下载了数据库) …
我正在尝试为SparklyR编写SQL函数的包装器.我创建了以下函数:
sqlfunction <- function(sc, block) {
spark_context(sc) %>%
invoke("sqlContext.sql", block) }
Run Code Online (Sandbox Code Playgroud)
然后我用以下方法调用它:
newsqlData <- sqlfunction(sc, "select
substr(V1,1,2),
substr(V1,3,3),
substr(V1,6,6),
substr(V1,12,4),
substr(V1,16,4)
FROM TABLE1 WHERE V1 IS NOT NULL")
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
Error: java.lang.IllegalArgumentException: invalid method sqlContext.sql for object 12
at sparklyr.Invoke$.invoke(invoke.scala:113)
at sparklyr.StreamHandler$.handleMethodCall(stream.scala:89)
at sparklyr.StreamHandler$.read(stream.scala:55)
at sparklyr.BackendHandler.channelRead0(handler.scala:49)
at sparklyr.BackendHandler.channelRead0(handler.scala:14)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:244)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)
at …Run Code Online (Sandbox Code Playgroud) 从 R Studio 的ODBC 数据库文档中,我可以看到一个如何将 SQL 表读入 R 数据框架的简单示例:
data <- dbReadTable(con, "flights")
Run Code Online (Sandbox Code Playgroud)
BGBUref让我粘贴我正在尝试读取 R 数据框的表格图形(?)。这是来自我在 R studio 中的连接窗格。
如果我使用与上面相同的语法,con我的输出在哪里dbConnect(...) ,我得到以下内容:
df <- dbReadTable(con, "BGBURef")
#> Error: <SQL> 'SELECT * FROM "BGBURef"' nanodbc/nanodbc.cpp:1587: 42S02:
#> [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name
#> 'BGBURef'.
Run Code Online (Sandbox Code Playgroud)
我对“表”的理解是否不正确?或者我是否需要执行类似的操作才能访问嵌套BGBUref表:
df <- dbReadTable(con, "QnRStore\dbo\BGBURef")
#> Error: '\d' is an unrecognized escape in character string starting ""QnRStore\d"
Run Code Online (Sandbox Code Playgroud)
如果我单击小电子表格图标,数据BGBUref框将出现在 R Studio 中。就我而言,我只是不知道如何将其放入定义的数据框中df。
这是我运行这些命令时的输出: …