如何在R中通过DBI库将一个SQLite数据库附加到另一个?
问题原因
你的ATTACH语句拼接时没有给数据库文件路径加字符串引号,SQLite会将未加引号的archive.db识别为列/表这类标识符,而非文件路径字符串,因此触发「no such column」报错。
修复方案
两种可行的实现方式,更推荐第二种参数化写法,可自动处理路径中的特殊字符、空格、转义符等情况,避免SQL注入风险。
方式1:手动给路径加单引号
library(DBI) NewDBFile <- "new.db" archiveFile <- "archive.db" con <- dbConnect(RSQLite::SQLite(), NewDBFile) # 给文件路径包裹单引号 rs <- dbExecute(conn = con, paste0("ATTACH '", archiveFile, "' AS archive;")) # 验证附加成功:列出archive库中的所有表 print(dbListTables(con, "archive")) dbDisconnect(con)
方式2:参数化查询(更推荐)
library(DBI) NewDBFile <- "new.db" archiveFile <- "archive.db" con <- dbConnect(RSQLite::SQLite(), NewDBFile) # 用?做占位符,params参数传入路径值,自动处理转义 rs <- dbExecute(conn = con, "ATTACH ? AS archive;", params = list(archiveFile)) # 验证附加成功:列出archive库中的所有表 print(dbListTables(con, "archive")) dbDisconnect(con)
注意事项
- 附加的数据库仅在当前数据库连接的生命周期内有效,断开连接后会自动分离,后续重新连接需要再次执行ATTACH语句。
- 若需要查询附加库中的表,写法为
archive.表名,例如dbGetQuery(con, "SELECT * FROM archive.user_log")。
内容的提问来源于stack exchange,提问作者Lia_G
相关产品推荐
相关产品推荐

