我使用下面的 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 当前不支持的其他数据库实现类似逻辑的最佳实践是什么?
看来您可以连接到 Trino 数据库,因此问题不在于 DBI 或 ODBC。您遇到了 dbplyr 当前可用功能的限制。
dbplyr 将 R 命令转换为等效的 SQL。由于不同的 SQL 版本使用的关键字/结构略有不同,因此 dbplyr 包含针对不同类型连接的转换规则。据我测试,dbplyr 中尚不存在 Trino 翻译。
如果您使用的数据库类型未在 dbplyr 中设置,您可以定义自己的翻译。
请注意,如果这些资源不足,则关于定义您自己的翻译的进一步指导很少。我不知道 Stackoverflow 上有任何 dbplyr 问题更详细地讨论了这个问题。
如果定义自定义翻译太多。您可以考虑其他三种方法:
sql()
功能绕过翻译:mutate(col1 = sql("CAST('' AS STRING)")
tbl %>% sql_render() %>% gsub(... details here ...) %>% tbl(src = connection)
。您可以使用 gsub
将 AS STRING
替换为 AS TEXT
。