使用pymonetdb向远程MonetDB服务器批量上传CSV失败咨询
问题解决:pymonetdb远程批量上传CSV报错
cannot transfer files from client 这个功能是可以实现的,报错核心原因在于文件路径处理或权限配置问题,以下是具体排查和解决步骤:
问题根源
SafeDirectoryHandler会严格限制客户端仅能访问指定目录内的文件,你的代码大概率存在文件路径不匹配或权限不足的情况,导致传输被拒绝。
解决步骤
确保CSV文件在指定目录内
你设置的SafeDirectoryHandler("/tmp/monetdb")只允许访问该目录下的文件,必须把要上传的CSV文件移动到/tmp/monetdb目录中,或者修改handler的路径指向CSV所在目录。修正COPY语句的路径格式
使用ON CLIENT时,路径需要用相对于handler目录的相对路径,而非绝对路径。比如CSV文件名为data.csv且在/tmp/monetdb下,COPY语句应改为:qry = paste0('COPY INTO "', db.table, '" FROM \'data.csv\' ON CLIENT USING DELIMITERS \',\'')若使用绝对路径,handler会判定为非法路径并直接拒绝传输。
验证目录权限
确保运行R/Python的用户对/tmp/monetdb目录有读写权限,Linux环境下可通过以下命令检查:ls -ld /tmp/monetdb若权限不足,执行:
chmod 755 /tmp/monetdb确认服务器配置(可选)
检查MonetDB服务器的monetdb.conf配置文件,确保allow_client_file_transfer = true(新版本默认开启,无需额外修改)。
修正后的完整代码示例
pyconn = pymonetdb$connect('testdb', hostname='1.1.1.1', port=50000, username='monetdb', password='monetdb') # 确保CSV文件存放在该目录下 handler = pymonetdb$SafeDirectoryHandler("/tmp/monetdb") pyconn$set_uploader(handler) cursor = pyconn$cursor() # 提取CSV文件名,使用相对路径 csv_filename = basename(csv.file) qry = paste0('COPY INTO "', db.table, '" FROM \'', csv_filename, '\' ON CLIENT USING DELIMITERS \',\'') cursor$execute(qry)
内容的提问来源于stack exchange,提问作者t_creasman
相关产品推荐
相关产品推荐

