R DBI 与 ODBC 为其他数据库转换数据类型

问题描述 投票:0回答:1

我使用下面的 DBI 连接和 ODBC 驱动程序来连接到 Trino 数据库

DBI::dbConnect(
  drv = odbc::odbc(),
  'trino'
)

无法翻译为.character()。

m_tbl %>% mutate(col1 = as.character(''))

它渲染的sql是

CAST('' AS STRING)
。然而,STRING 不是 Trino 可接受的数据类型。它应该转换成文本。

我在r-dbi/odbc中找到了文件

driver-{db_name}.R
,其中有数据类型转换的实现。以下是 postgres 的示例:https://github.com/r-dbi/odbc/blob/main/R/driver-postgres.R

对于 DBI ODBC 当前不支持的其他数据库实现类似逻辑的最佳实践是什么?

dplyr odbc dbi trino dbplyr
1个回答
0
投票

看来您可以连接到 Trino 数据库,因此问题不在于 DBI 或 ODBC。您遇到了 dbplyr 当前可用功能的限制。

dbplyr 将 R 命令转换为等效的 SQL。由于不同的 SQL 版本使用的关键字/结构略有不同,因此 dbplyr 包含针对不同类型连接的转换规则。据我测试,dbplyr 中尚不存在 Trino 翻译。

如果您使用的数据库类型未在 dbplyr 中设置,您可以定义自己的翻译。

请注意,如果这些资源不足,则关于定义您自己的翻译的进一步指导很少。我不知道 Stackoverflow 上有任何 dbplyr 问题更详细地讨论了这个问题。


如果定义自定义翻译太多。您可以考虑其他三种方法:

  • 创建自定义 SQL 函数:此处为示例
  • 使用
    sql()
    功能绕过翻译:
    mutate(col1 = sql("CAST('' AS STRING)")
  • 修改 SQL 翻译。比如:
    tbl %>% sql_render() %>% gsub(... details here ...) %>% tbl(src = connection)
    。您可以使用
    gsub
    AS STRING
    替换为
    AS TEXT
© www.soinside.com 2019 - 2024. All rights reserved.