标签: r-dbi

仅在查询返回少于n_max行时收集

偶尔连接到我的Oracle数据库时ROracle,dbplyr我将运行一个取得dplyr::collect比预期更多的数据的操作,而不是R可以处理.

这可能会导致R崩溃,并且通常是我应该在获取之前进一步过滤或聚合数据的标志.

能够在选择是否获取结果之前检查结果的大小(不运行查询两次)会很棒.

让我们来命名它collect2的变化,collect这样就可以了:

预期行为:

small_t <- con %>% tbl("small_table") %>%
  filter_group_etc %>%
  collect2(n_max = 5e6) # works fine

big_t   <- con %>% tbl("big_table")   %>%
  filter_group_etc %>%
  collect2(n_max = 5e6) # Error: query returned 15.486.245 rows, n_max set to 5.000.000
Run Code Online (Sandbox Code Playgroud)

这可能吗?

我也对使用ROracle/ DBI不使用的解决方案持开放态度dplyr,例如:

dbGetQuery2(con, my_big_sql_query,n_max = 5e6) # Error: query returned 15.486.245 rows, n_max set to 5.000.000
Run Code Online (Sandbox Code Playgroud)

编辑:

请参阅下面作为答案发布的部分解决方案,不是最佳的,因为浪费了一些时间来获取我没有用的数据.

r dplyr r-dbi roracle dbplyr

14
推荐指数
2
解决办法
790
查看次数

我是否可以仅使用R中的dplyr语法运行SQL更新语句

我需要在某些PostgreSQL数据库表的其他列上更新条件值conditionnaly .我设法在R中编写一个SQL语句并dbExecuteDBI包中执行它.

library(dplyr)
library(DBI)

# Establish connection with database
con <- dbConnect(RPostgreSQL::PostgreSQL(), dbname = "myDb",
                 host="localhost", port= 5432, user="me",password = myPwd)

# Write SQL update statement
request <- paste("UPDATE table_to_update",
                 "SET var_to_change = 'new value' ",
                 "WHERE filter_var = 'filter' ")

# Back-end execution
con %>% dbExecute(request)
Run Code Online (Sandbox Code Playgroud)

是否可以仅使用dplyr语法执行此操作?出于好奇,我试过了

con %>% tbl("table_to_update") %>%
   mutate(var_to_change = if (filter_var == 'filter') 'new value' else var_to_change)
Run Code Online (Sandbox Code Playgroud)

它在R中工作但显然在db中没有任何作用,因为它使用了一个select语句.copy_to只允许appendoverwite选项,所以我看不到如何使用它,除非删除然后附加过滤后的观察...

r rstudio rpostgresql dplyr r-dbi

10
推荐指数
1
解决办法
1605
查看次数

如何使用R DBI传递data.frame for UPDATE

使用RODBC,有类似的功能sqlUpdate(channel, dat, ...)允许您传递dat = data.frame(...)而不必构建自己的SQL字符串.

但是,使用R的DBI,我看到的dbSendQuery(conn, statement, ...)只是一个字符串的函数,statement并没有机会data.frame直接指定.

那么如何UPDATE使用data.frameDBI?

database r dataframe rodbc r-dbi

9
推荐指数
2
解决办法
3165
查看次数

RMySQL系统错误:10060

我有一个项目,其连接在同一设备上正常工作.我突然得到了下面的错误.我可以通过MySQL工作台从同一台设备连接.

可能是什么原因?

library(RMySQL)

con <- dbConnect(RMySQL::MySQL(),
                 host = "xxx",
                 dbname="yyy",
                 user = "zzz",
                 password = "############")

Error in .local(drv, ...) : 
  Failed to connect to database: Error: Lost connection to MySQL server at 'reading authorization packet', system error: 10060
Run Code Online (Sandbox Code Playgroud)

这是会话信息

> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods …
Run Code Online (Sandbox Code Playgroud)

mysql r rmysql r-dbi

9
推荐指数
1
解决办法
3121
查看次数

在R DBI中将参数传递给查询的正确方法

在perl/python中,DBI API有一种机制可以在参数中安全地插入sql查询.例如在python中我会这样做:

cursor.execute("SELECT * FROM table WHERE value > ?", (5,))    
Run Code Online (Sandbox Code Playgroud)

其中execute方法的第二个参数是要添加到sql查询中的参数元组

R的DBI兼容API是否有类似的机制?我见过的例子从未显示传递给查询的参数.如果不是,在参数中插入查询最安全的方法是什么?我特意看着使用RPostgresSQL.

r rpostgresql r-dbi

8
推荐指数
2
解决办法
1811
查看次数

有没有办法在使用DBI和dbGetQuery时超时MySql查询?

我意识到了

dbGetQuery comes with a default implementation that calls dbSendQuery, then dbFetch, ensuring that the result is always freed by dbClearResult.

dbClearResult frees all resources (local and remote) associated with a result set. In some cases (e.g., very large result sets) this can be a critical step to avoid exhausting resources (memory, file descriptors, etc.)

但我的团队刚刚经历了一个锁定的表,我们进入了MySQL kill pid,我想知道 - 有没有办法超时使用该DBI包提交的查询?

我正在寻找,找不到相应的

dbGetQuery(conn = connection, 'select stuff from that_table', timeout = 90)

我尝试了这个,并使用和不使用参数集来分析函数,它似乎没有做任何事情; 为什么会这样,如果dbClearResult总是在玩?

mysql timeout r jdbc r-dbi

8
推荐指数
1
解决办法
789
查看次数

设置dbGetQuery以将integer64作为整数返回

默认情况下,当我dbGetQuery()DBI包中使用时,它返回类型的列integer64作为integer64类的类bit64.

然后我dplyr用来尝试过滤和操作我的结果但是因为dplyr不支持类型的对象而产生问题integer64.

是否有可能设置dbGetQuery()返回integer64的列类integer

odbc integer r dplyr r-dbi

8
推荐指数
2
解决办法
2360
查看次数

在SQLite中使用子查询更新表

我想使用ALTER TABLEUPDATE语句添加一个列到我的表,而不是重新创建完整的表.

在我的UPDATE语句中使用子查询时,我没有得到我期望的输出.

建立可重复的数据

library(dplyr)
library(dbplyr)
library(DBI)
con <- DBI::dbConnect(RSQLite::SQLite(), path = ":memory:")
copy_to(con, iris[c(1,2,51),],"iris")

tbl(con,"iris")
# # Source:   table<iris> [?? x 5]
# # Database: sqlite 3.19.3 []
#   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#          <dbl>       <dbl>        <dbl>       <dbl>      <chr>
# 1          5.1         3.5          1.4         0.2     setosa
# 2          4.9         3.0          1.4         0.2     setosa
# 3          7.0         3.2          4.7         1.4 versicolor
Run Code Online (Sandbox Code Playgroud)

在单独的表中创建新列

DBI::dbSendQuery(con, "CREATE TABLE new_table AS SELECT t2.new_col from
                 iris t1 inner …
Run Code Online (Sandbox Code Playgroud)

sqlite r rsqlite r-dbi dbplyr

8
推荐指数
1
解决办法
325
查看次数

如何使用glue_data_sql在SQL Server数据库上编写安全的参数化查询?

问题

我想围绕一些DBI函数编写一个包装器,以允许安全执行参数化查询。我找到了这个资源,它解释了如何使用该glue包将参数插入 SQL 查询。但是,似乎有两种不同的方法可以使用glue包插入参数:

  1. 方法1涉及?在需要插入参数的sql查询中使用use,然后随后使用usedbBind来填充它们。上面链接中的示例:
library(glue)
library(DBI)

airport_sql <- glue_sql("SELECT * FROM airports WHERE faa = ?")
airport <- dbSendQuery(con, airport_sql)

dbBind(airport, list("GPT"))
dbFetch(airport)
Run Code Online (Sandbox Code Playgroud)
  1. 方法 2涉及使用glue_sqlglue_data_sql自行填写参数(不使用dbBind)。还是上面链接中的一个例子:
airport_sql <- 
  glue_sql(
    "SELECT * FROM airports WHERE faa IN ({airports*})", 
    airports = c("GPT", "MSY"),
    .con = con
  )

airport <- dbSendQuery(con, airport_sql)

dbFetch(airport)
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用第二种方法,因为它有很多额外的功能,例如折叠sql 语句子句in中语句的多个值。where请参阅上面的第二个示例了解其工作原理(请注意*参数后面的 表示它必须折叠)。问题是:这对于 SQL …

sql-server r r-dbi

8
推荐指数
0
解决办法
1644
查看次数

如何通过管道将 SQL 导入 R 的 dplyr?

我可以在 R 中使用以下代码在任何通用 SQL 数据库中选择不同的行。我会使用,dplyr::distinct()但 SQL 语法不支持它。无论如何,这确实有效:

dbGetQuery(database_name, 
           "SELECT t.* 
           FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY column_name) AS SEQNUM 
           FROM table_name t
           ) t 
           WHERE SEQNUM = 1;")
Run Code Online (Sandbox Code Playgroud)

我一直在成功地使用它,但想知道如何在其他 dplyr 步骤之后通过管道传输相同的 SQL 查询,而不是仅将其用作如上所示的第一步。这最好用一个例子来说明:

distinct.df <- 
  left_join(sql_table_1, sql_table_2, by = "col5") %>% 
  sql("SELECT t.* 
      FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY column_name ORDER BY column_name) AS SEQNUM 
      FROM table_name t
      ) t 
      WHERE SEQNUM = 1;")
Run Code Online (Sandbox Code Playgroud)

所以我有dplyr::left_join()两个 SQL 表,然后我想查看不同的行,并保留所有列。我是否如上所示将 SQL 代码通过管道传输到 R 中(仅使用该 …

sql r dplyr r-dbi dbplyr

8
推荐指数
2
解决办法
1385
查看次数

标签 统计

r ×10

r-dbi ×10

dplyr ×4

dbplyr ×3

mysql ×2

rpostgresql ×2

database ×1

dataframe ×1

integer ×1

jdbc ×1

odbc ×1

rmysql ×1

rodbc ×1

roracle ×1

rsqlite ×1

rstudio ×1

sql ×1

sql-server ×1

sqlite ×1

timeout ×1