Недавно я обновил R, RSQLite и sqldf (версии ниже).sqldf: создать таблицу из ошибки фрейма данных: «нет такой таблицы». и две таблицы созданы вместо одного
Обычно:
sqldf('create table foo as select * from bar', db = 'test.db')
необходимо создать таблицу с именем «Foo» в присоединенной базе данных SQLite, используя кадр данных «бар», если он существует, чтобы загрузить новую таблицу.
Вместо этого я получаю ошибку «нет такой таблицы», а также когда я смотрю на базу данных, создаются таблицы «foo» и «bar».
Возпроизводимо пример:
library(RSQLite)
library(sqldf)
mydb = 'test.db'
## remove file if it exists
system(paste('rm', mydb))
## open connection
##con <- dbConnect(SQLite(), dbname=mydb)
system(paste('ls -l', mydb))
sqldf(paste0('attach "', mydb, '" as new'))
system(paste('ls -l', mydb))
class(mtcars)
sqldf('create table mycars as select * from mtcars', dbname = mydb)
sqldf('select * from sqlite_master', dbname = mydb)
sqldf('select * from main.mycars limit 1', dbname = mydb)
sqldf('select * from main.mtcars limit 1', dbname = mydb)
sessionInfo()
, который производит две таблицы и выдает ошибку (в довершение):
> library(RSQLite)
> library(sqldf)
Loading required package: gsubfn
Loading required package: proto
> mydb = 'test.db'
> ## remove file if it exists
> system(paste('rm', mydb))
> ## open connection
> ##con <- dbConnect(SQLite(), dbname=mydb)
> system(paste('ls -l', mydb))
ls: test.db: No such file or directory
> sqldf(paste0('attach "', mydb, '" as new'))
Loading required package: tcltk
data frame with 0 columns and 0 rows
> system(paste('ls -l', mydb))
-rwxrwxrwx 1 nathan staff 1 Jan 6 10:01 test.db
> class(mtcars)
[1] "data.frame"
> sqldf('create table mycars as select * from mtcars', dbname = mydb)
Error in rsqlite_send_query([email protected], statement) :
no such table: `mtcars`
In addition: Warning message:
Quoted identifiers should have class SQL, use DBI::SQL() if the caller performs the quoting.
> sqldf('select * from sqlite_master', dbname = mydb)
type name tbl_name rootpage
1 table mtcars mtcars 2
2 table mycars mycars 5
sql
1 CREATE TABLE `mtcars` (\n "mpg" REAL,\n "cyl" REAL,\n "disp" REAL,\n "hp" REAL,\n "drat" REAL,\n "wt" REAL,\n "qsec" REAL,\n "vs" REAL,\n "am" REAL,\n "gear" REAL,\n "carb" REAL\n)
2 CREATE TABLE mycars(\n mpg REAL,\n cyl REAL,\n disp REAL,\n hp REAL,\n drat REAL,\n wt REAL,\n qsec REAL,\n vs REAL,\n am REAL,\n gear REAL,\n carb REAL\n)
> sqldf('select * from main.mycars limit 1', dbname = mydb)
mpg cyl disp hp drat wt qsec vs am gear carb
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
> sqldf('select * from main.mtcars limit 1', dbname = mydb)
mpg cyl disp hp drat wt qsec vs am gear carb
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X El Capitan 10.11.6
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] tcltk stats graphics grDevices utils datasets methods base
other attached packages:
[1] sqldf_0.4-10 gsubfn_0.6-6 proto_1.0.0 RSQLite_1.1-1 devtools_1.12.0
loaded via a namespace (and not attached):
[1] DBI_0.5-1 withr_1.0.2 Rcpp_0.12.8 memoise_1.0.0 digest_0.6.11 chron_2.3-48
Is this a bug or some new intended behavior? Thanks for your help.
Возможно, вы смешиваете среды (R vs SQLite). Почему бы не использовать 'dbWriteTable()' RSQLite и оставить 'sqldf()' только для управления R dfs? – Parfait
Недавно был выпущен RSLQite 1.1-1, и я подозреваю, что он ввел некоторую несовместимость с существующим программным обеспечением. Предложите вам вернуться к RSQLite 1.0.0: 'devtools :: install_url (" https://cran.r-project.org/src/contrib/Archive/RSQLite/RSQLite_1.0.0.tar.gz ")' –
@G .Grothendieck: '? DbWriteTable' и'? DbRemoveTable' говорит, что 'name' является символьной строкой [a] с указанием имени таблицы СУБД", в ней говорится, что имя 'name' должно быть процитировано, вот что означает' sqldf' делать внутренне. Я бы сказал, что sqldf работает вне спецификации здесь. Тем не менее, я очень скоро выпущу RSQLite 1.1-2, чтобы улучшить совместимость sqldf. – krlmlr