我想使用ALTER TABLE
和UPDATE
语句添加一个列到我的表,而不是重新创建完整的表.
在我的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) 我无法列出我从 R 连接到的 sqlite 数据库的表。
我使用“数据库浏览器” https://sqlitebrowser.org/在数据库 (WBS_test1.db) 中设置表
在命令窗口中查看此数据库,我可以通过 .tables 列出表并通过 .schema 查看数据标头,因此我知道它们是(当然也可以在数据库浏览器中预览)。
然而,在 R 中...,我设置了我的工作目录等。
library(DBI)
library(RSQLite)
setwd(dir = "C:/here/there/folder")
sqlite <- dbDriver("SQLite")
Run Code Online (Sandbox Code Playgroud)
然后,我连接到数据库并尝试专门列出其中一个表中的表和字段
DBtest <- dbConnect(sqlite,"WBS_Test1.db")
dbListTables(DBtest)
dbListFields(DBtest, "WBS_CO2")
Run Code Online (Sandbox Code Playgroud)
我得到一个返回的“字符(0)”,从周围搜索看来,它表明这些表是临时的。
我也尝试过使用 dplyr 包
library(dplyr)
# connect to the sqlite file
test_db <- src_sqlite("C:/SQLite/WBS_test.db", create = TRUE)
src_tbls(test_db)
Run Code Online (Sandbox Code Playgroud)
这再次返回一个“字符(0)”
我之前没有使用 SQLite 的经验,也没有使用 R 的经验,所以我可能错过了一些简单的东西,但我无法弄清楚。建议???也许我没有将 wd 定向到 RSQLite 包的正确位置?
谢谢!
我有几个大型 R data.frames,我想将它们放入本地 duckdb 数据库中。我遇到的问题是 duckdb 似乎将所有内容加载到内存中,即使我指定一个文件作为位置。
另外,我不清楚建立连接的正确方法(所以我不确定这是否与此有关)。我努力了:
duckdrv <- duckdb(dbdir="dt.db", read_only=FALSE)
dkCon <- dbConnect(drv=duckdrv)
Run Code Online (Sandbox Code Playgroud)
并且:
duckdrv <- duckdb()
dkCon <- dbConnect(drv=duckdrv, dbdir="dt.db", read_only=FALSE)
Run Code Online (Sandbox Code Playgroud)
两者都工作正常,这意味着我可以创建表、使用 dbWriteTable、运行查询等。但是,内存使用量非常高(与 data.frames 的大小大约相同)。我想我在某处读到,duckdb 默认使用一定百分比的可用内存,这对我来说不起作用,因为我使用的系统是共享资源。我还想并行运行一些查询,这将导致内存使用量更高。
我已经尝试过这个:
dbExecute(dkCon, "PRAGMA memory_limit='1GB';")
Run Code Online (Sandbox Code Playgroud)
但这似乎没有什么区别,即使我关闭连接,关闭实例并重新连接。
有谁知道我该如何解决这个问题?当我将数据写入表时,RSQLite 也暂时具有较高的内存使用率,但随后它会恢复正常,如果我打开只读连接,则根本不是问题。我想让 duckdb 工作,因为我认为查询应该更快。任何帮助,将不胜感激!
我正在使用RSQLite
R in中的库来管理对RAM来说太大的数据集.对于每个回归,我查询数据库以一次检索一个会计年度.现在我有财政年度的硬编码:
data.annual <- dbGetQuery(db, "SELECT * FROM annual WHERE fyear==2008")
Run Code Online (Sandbox Code Playgroud)
我想让财政年度(2008年上面)让变更更容易(并且万无一失).有没有办法可以将变量传递给SQL查询字符串?我很乐意使用:
fiscal.year <- 2008
data.annual <- dbGetQuery(db, "SELECT * FROM annual WHERE fyear==fiscal.year")
Run Code Online (Sandbox Code Playgroud) 我正在尝试将我在 R 中生成的向量作为新列添加到 sqlite 表中。为此,我想使用dplyr
(dbplyr
根据此处的这篇文章,我安装了最新的开发版本以及软件包)。我试过的:
library(dplyr)
library(DBI)
#creating initial database and table
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
cars_tbl <- dplyr::tbl(dbcon, "cars")
#new values which I want to add as a new column
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)
#attempt to add new values as column to the table in the database
cars_tbl %>% mutate(new_col = new_values) #not working
Run Code Online (Sandbox Code Playgroud)
实现这一目标的简单方法是什么(不一定使用 dplyr)?
我正在使用 R 包 dbplyr 创建一个数据库,使用 RSQLite,但我的数据库在磁盘上的大小为零字节,尽管我写了(和读回)了一个表。这是我的脚本:
library("RSQLite")
library("dbplyr")
library("dplyr")
data(mtcars)
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "./mtcars.db")
copy_to(con, mtcars, "mtcars")
print(tbl(con, "mtcars"))
Run Code Online (Sandbox Code Playgroud)
但是正如你从最后的 ls -l 看到的,我的数据库大小是 0,即使脚本确实从数据库中读取了 mtcars(所以它在那里)。我想使用数据库文件与另一个程序共享数据,那么如何定期将数据“刷新”到磁盘?
tbrowne@calculon:~/scratch$ R -f dplysqlite.r
R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
Natural language support but …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为 SQLite 数据库创建一个带有主键的表。有没有办法用 DBI 来做到这一点?我查看了文档,但看不到任何示例。我正在尝试类似下面的例子。
library(DBI)
library(RSQLite)
conn <- dbConnect(RSQLite::SQLite(), "")
DBI::dbCreateTable(conn, "mytable", c(a = "integer", b = "text"), 'PRIMARY KEY("a")')
dbDisconnect(conn)
Run Code Online (Sandbox Code Playgroud) 我在用 bioconductor 安装 biomaRt 时遇到问题。我已经使用 R 3.6 在 Rstudio 中安装了这个包而没有错误,但是在 conda 特定环境容器中使用 R 4.0,我在使用 RSQLite 时出现错误。
这里是这个消息:
x86_64-conda-linux-gnu-c++ -std=gnu++11 -I"/home/legrand-lab/anaconda3/envs/r4-base/lib/R/include" -DNDEBUG -I. -Ivendor -DRSQLITE_USE_BUNDLED_SQLITE -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_STAT4 -DSQLITE_SOUNDEX -DRCPP_DEFAULT_INCLUDE_CALL=false -DRCPP_USING_UTF8_ERROR_STRING -DBOOST_NO_AUTO_PTR -DSQLITE_MAX_LENGTH=2147483647 -DHAVE_USLEEP=1 -I'/home/legrand-lab/anaconda3/envs/r4-base/lib/R/library/plogr/include' -I'/home/legrand-lab/anaconda3/envs/r4-base/lib/R/library/Rcpp/include' -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/legrand-lab/anaconda3/envs/r4-base/include -I/home/legrand-lab/anaconda3/envs/r4-base/include -Wl,-rpath-link,/home/legrand-lab/anaconda3/envs/r4-base/lib -fvisibility=hidden -fpic -fvisibility-inlines-hidden -fmessage-length=0 -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/legrand-lab/anaconda3/envs/r4-base/include -fdebug-prefix-map=/home/conda/feedstock_root/build_artifacts/r-base-split_1616773775410/work=/usr/local/src/conda/r-base-4.0.3 -fdebug-prefix-map=/home/legrand-lab/anaconda3/envs/r4-base=/usr/local/src/conda-prefix -c SqliteColumnDataSource.cpp -o SqliteColumnDataSource.o
In file included from vendor/boost/math/special_functions/sign.hpp:16,
from vendor/boost/lexical_cast/detail/inf_nan.hpp:34,
from vendor/boost/lexical_cast/detail/converter_lexical_streams.hpp:63,
from vendor/boost/lexical_cast/detail/converter_lexical.hpp:54,
from vendor/boost/lexical_cast/try_lexical_convert.hpp:44,
from …
Run Code Online (Sandbox Code Playgroud) 我是 RSQLite 新手。我有一个文本格式的输入文档,其中值由“|”分开 我创建了一个包含所需变量的表(虚拟代码如下)
db<-dbconnect(SQLite(),dbname="test.sqlite")
dbSendQuery(conn=db,
"CREATE TABLE TABLE1(
MARKS INTEGER,
ROLLNUM INTEGER
NAME CHAR(25)
DATED DATE)"
)
Run Code Online (Sandbox Code Playgroud)
然而,我对如何将值导入到创建的表中感到震惊。我无法使用 INSERT INTO Values 命令,因为原始数据文件中有数千行和 20 多列,并且不可能手动输入每个数据点。
有人可以建议一种替代的有效方法吗?
我需要检查我的res
fromdbSendQuery()
是否结束。
我的代码是这样的:
db <- dbConnect(drv=SQLite(),flags=SQLITE_RW,dbname="db.sqlite",synchronous = "off")
dbBegin(db)
res <- dbSendQuery(db,"Update Operation SET Name = 'teste' where Id = 1")
if("my SendQuery is over"){
dbClearResult(res)
dbCommit(db)
dbDisconnect(db)
}
Run Code Online (Sandbox Code Playgroud)
我需要知道什么时候结束才能将其发送到提交然后断开连接。
更新 1 我是我的系统,对于上面的示例,可能会同时发生超过 1 个用户。然后,当数据库中的第一个连接结束时,我需要完成他的请求并为其他连接提供编写查询的可能性。