如何阻止glue_sql将布尔值自动转换为整数?
解决glue_sql将布尔值转换为整数的问题
glue_sql默认会通过DBI的dbQuoteLiteral方法转换R对象为SQL字面量,而SQLite的该方法会把布尔值TRUE/FALSE转为1/0。要阻止这种转换,让SQL语句中保留TRUE/FALSE字面量,可以通过以下两种方式实现:
方法一:手动将布尔值包装为SQL对象
直接用DBI::SQL()将布尔值包装为SQL原生字面量,这样glue_sql会直接插入这些值而不进行转换:
library(glue) library(DBI) library(RSQLite) con <- dbConnect(RSQLite::SQLite(), "test.sqlite") # 将布尔值用SQL()包装 rows <- list("ABC", 1, pi, SQL("TRUE"), SQL("FALSE")) glue_sql("INSERT into table values ({rows*})", rows = rows, .con = con) #> <SQL> INSERT into table values ('ABC', 1, 3.14159265358979, TRUE, FALSE)
方法二:批量处理布尔值
如果有大量布尔值需要处理,可以写一个辅助函数自动转换:
library(glue) library(DBI) library(RSQLite) con <- dbConnect(RSQLite::SQLite(), "test.sqlite") # 定义布尔值转换函数 format_sql_bool <- function(x) { if (is.logical(x)) { SQL(ifelse(x, "TRUE", "FALSE")) } else { x } } rows <- list("ABC", 1, pi, TRUE, FALSE) # 批量处理列表中的布尔值 processed_rows <- lapply(rows, format_sql_bool) glue_sql("INSERT into table values ({processed_rows*})", processed_rows = processed_rows, .con = con) #> <SQL> INSERT into table values ('ABC', 1, 3.14159265358979, TRUE, FALSE)
注意事项
SQLite本身没有原生的布尔数据类型,即使SQL语句中写TRUE/FALSE,最终存储到数据库中的还是整数1/0。如果使用PostgreSQL等原生支持布尔类型的数据库,上述方法会正确插入布尔类型值。
内容的提问来源于stack exchange,提问作者Martin Gal
相关产品推荐
相关产品推荐

