括号转义表名称与dplyr

前端之家收集整理的这篇文章主要介绍了括号转义表名称与dplyr前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我以编程方式获取一堆数据集,其中许多数据都有愚蠢的名字,以数字开头,并有特殊字符,如减号。因为没有一个数据集是特别大的,而且我想让R对数据类型做出最好的猜测,我(ab)使用dplyr将这些表转储到sqlite中。

我使用方括号来摆脱可怕的表名,但这似乎不起作用。例如:

data(iris)
foo.db <- src_sqlite("foo.sqlite3",create = TRUE)
copy_to(foo.db,df=iris,name="[14m3-n4m3]")

这将导致错误消息:

sqliteSendQuery(conn,statement,bind.data)中的错误:语句中的错误:没有这样的表:14m3-n4m3

如果我选择一个明智的名字,这个工作。然而,由于各种原因,我真的很想保留繁琐的名字。我也可以直接从sqlite创建一个这么命名的表:

sqlite> create table [14m3-n4m3](foo,bar,baz);
sqlite> .tables
14m3-n4m3

没有破裂的东西太深了,这看起来像dplyr正在处理方括号,我无法弄清楚。我怀疑这是一个bug,但是我想先检查一下,以确保我没有丢失任何东西。

编辑:我忘了提到我只是直接把janky的名字传给dplyr的情况。这个错误出来如下:

library(dplyr)

data(iris)
foo.db <- src_sqlite("foo.sqlite3",name="14M3-N4M3")

Error in sqliteSendQuery(conn,statement,bind.data) : 
  error in statement: unrecognized token: "14M3"
这是dplyr中的一个错误。目前的github主人还在那里。正如@hadley所说,他试图逃避dplyr中的表名,以防止这个问题。目前的问题是由于缺少两项功能的转义。当表名不提供(并使用dplyr :: db_create_table完成)时,表创建工作正常。但是,使用不支持奇数表名的DBI :: dbWriteTable来将数据插入到表中。如果表名被提供给此函数转义,则无法在表的列表中找到它(您报告的第一个错误)。如果提供了转义,那么执行插入的sql不是协作有效的。

第二个问题出现在表更新时。获取字段名称代码,这次实际上在dplyr中,再次无法转义表名,因为它使用paste0而不是build_sql

我已经在a fork of dplyr修复了这两个错误。我还向@hadley提出了一个请求,并在https://github.com/hadley/dplyr/issues/926发布了一个注释。同时,如果你想使用devtools :: install_github(“NikNakk / dplyr “,ref =”sqlite-escape“),然后恢复到主版本一旦它被修复。

顺便提一下,sql中使用sql-99方法来转义表名(和其他标识符)是双引号(见SQL standard to escape column names?)。 MS Access使用方括号,而MysqL默认为反引号。 dplyr按照标准使用双引号。

最后,@RichardScriven的建议不会普遍运作。例如,select在R中是完全有效的名称,但在sql中不是语法上有效的表名。其他保留字也同样如此。

原文链接:https://www.f2er.com/sqlite/197976.html

猜你在找的Sqlite相关文章