加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

括号转义表名称与dplyr

发布时间:2020-12-12 19:14:58 所属栏目:百科 来源:网络整理
导读:我以编程方式获取一堆数据集,其中许多数据都有愚蠢的名字,以数字开头,并有特殊字符,如减号。因为没有一个数据集是特别大的,而且我想让R对数据类型做出最好的猜测,我(ab)使用dplyr将这些表转储到SQLite中。 我使用方括号来摆脱可怕的表名,但这似乎不起
我以编程方式获取一堆数据集,其中许多数据都有愚蠢的名字,以数字开头,并有特殊字符,如减号。因为没有一个数据集是特别大的,而且我想让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中不是语法上有效的表名。其他保留字也同样如此。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读