shinyapps.io发布Shiny应用时odbc连接Access数据库失败咨询
问题根因
shinyapps.io的运行环境为Ubuntu Linux,该环境默认没有预装Microsoft Access ODBC驱动,且微软从未推出过官方Linux版本的Access accdb/mdb格式驱动,同时shinyapps.io不开放用户系统级软件安装权限。你本地Windows环境下能正常运行的连接代码,在平台上因为找不到对应驱动会在启动阶段直接报错终止,返回应用启动失败、exit status 1的提示。
可落地解决方案
方案1(推荐,100%兼容shinyapps.io):将Access数据库迁移为SQLite格式
SQLite是和Access类似的单文件嵌入式数据库,对应的R包RSQLite为纯R实现,发布时会自动随应用部署到shinyapps.io,不需要额外安装系统驱动,迁移成本极低:
- 第一步:本地环境先运行一次转换代码,把accdb里的所有表批量导出到SQLite文件
# 仅本地运行一次,完成数据库格式转换 library(DBI) library(odbc) library(RSQLite) library(dplyr) # 连接本地原Access数据库 accdb_con <- dbConnect( odbc::odbc(), .connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=./RBDD.accdb" ) # 新建同名SQLite数据库文件 sqlite_con <- dbConnect(RSQLite::SQLite(), "./RBDD.sqlite") # 批量迁移Access中所有表到SQLite for (tbl_name in dbListTables(accdb_con)) { temp_df <- dbReadTable(accdb_con, tbl_name) dbWriteTable(sqlite_con, tbl_name, temp_df, overwrite = TRUE) } # 关闭连接,完成转换 dbDisconnect(accdb_con) dbDisconnect(sqlite_con)
- 第二步:将原应用中Access连接代码替换为SQLite连接代码,后续数据查询、处理逻辑完全不用修改
library(shiny) library(DBI) library(RSQLite) library(dplyr) # 直接连接同目录下的SQLite文件,本地、shinyapps.io环境全兼容 myDB <- dbConnect(RSQLite::SQLite(), dbname = "./RBDD.sqlite") dbListTables(myDB) Sample <- dbReadTable(myDB, "Sample") Sample$SampleDate <- as.Date(Sample$SampleDate,"%m/%d/%Y") Catch <- dbReadTable(myDB,"Catch") joined <- left_join(Catch,Sample,by="SampleRowID")
- 第三步:把生成的
RBDD.sqlite文件和app.R等项目代码文件一起发布到shinyapps.io即可正常运行。
方案2:更换支持Windows运行时的Shiny部署平台
如果必须保留Access数据库格式不做迁移,就不要使用shinyapps.io——该平台仅提供Linux运行环境,永远无法原生支持Access驱动。可以选择以下部署方式:
- 自行搭建Windows服务器,安装开源Shiny Server Open Source或Posit Connect商业版部署应用,原代码无需任何修改即可运行
- 选用支持Windows容器的第三方Shiny托管服务,当运行环境和本地Windows环境一致时,原Access连接逻辑可直接生效
无效避坑提示
- 不要尝试在shinyapps.io上修改
odbcinst.ini配置注册Access驱动:平台不开放root权限,用户无法修改系统级ODBC配置,所有相关教程在shinyapps.io上均无法落地 - 不要尝试依赖
Hmisc::mdb.get()等基于mdbtools的工具读取accdb:shinyapps.io未预装mdbtools系统库,且该工具对高版本accdb文件兼容性极差,容易出现字段类型解析错误、数据丢失、中文乱码等问题 - 不要尝试把Access驱动文件随应用一起上传:ODBC驱动需要系统级注册才能被odbc包调用,单纯上传dll/so文件无法生效
内容的提问来源于stack exchange,提问作者Salvador
相关产品推荐
相关产品推荐

