R包系列——RODBC包教程
在R基础——数据的导入与导出(下)中,介绍了使用RODBC包连接SQL server数据库,在这篇文章中,根据我工作内容,介绍该包的基本操作,同时,根据我使用该包时出现的问题,介绍解决问题的方法。
首先,连接数据库;
#连接数据库conn
获取数据库表信息
场景:在数据库中有多个相同结构(列)的表,但是列名不同,获取其中一个表的列名,再统一其他表的列名。
#获取列名colname
对于批量处理,统一列名就可以使用同一列名操作了,而不用再重复写代码。当然,使用数值向量也是可以的,但是这样就降低了代码的可读性,我还是偏向于使用列名。
读取数据
场景:读取数据库的表中数据至R中。
#读取数据#整表读取df
可以看出来,该函数的使用较为简单,像其他where语句,group by语句等等复杂的查询都无法实现。所以这个函数在我工作中,基本不怎么使用。
使用sqlQuery函数
sqlQuery()函数直接使用sql语句,对数据库进行查询。
#使用sqlQuery进行复杂的查询df
sqlQuery()函数的第二个参数为sql的查询语句,需要对sql语句有一定的熟悉。
导出至数据库
场景:当在R中跑了模型或者处理完数据,需要保存至数据库重复利用时。
#整表导入数据库sqlSave(conn, df, "表名")#向已有表追加数据sqlSave(conn, df, "表名", append = T)
在向已有表中追加数据的时候,会经常出现问题:数据类型无法转化,导致无法追加;
#指定转换类型#列名colname
上面的方法能够解决一部分问题,但是仍然会在一些类型转换中出现问题。我一般的做法是这样:先将要追加进数据库的数据框导入到数据库中,再使用sql语句插入到已有表中。
#使用insert into方法将数据追加至数据库中已有表中SqlInsertSelect
对于sqlSave()函数的追加功能,实在是太差了,各种BUG,体验太差了。而使用sql语句插入,则完全没问题,故我一般使用该方法。
更新表
场景:需要对数据库中表进行更新。
#更新表sqlUpdate(conn, df, "更新的表名")
使用该函数更新表中的数据,需要数据框与数据库中表的结构一致,不然会更新失败。
在我工作中,由于需要更新的表不大,我一般使用整表更新:清空已有表,再插入表。
#整表更新#清空表sqlClear(conn, "表名")#插入表,使用上面的函数SqlInsertSelect(newdf, conn, "表名")
当表较大的时候,还是使用sqlQuery()函数更新为好。
#使用sqlQuery()函数更新sqlQuery(conn, "update 表名 set 列名 = 值 where ")
复制表
场景:当需要将数据库中的某一表复制至另一个数据库中。
#复制表sqlCopy( channel = conn, query = "select * from conn表名", destination = "conn2表名", #复制的表名 destchannel = conn2)
在我工作中,需要将主数据库中的一个表复制至另一个数据库,该函数很好的解决了我这个痛点。
其他操作
场景:其他操作,常用但简单功能。
#删除表sqlDrop(conn, "表名")#关闭连接odbcClose(conn)
使用完数据库后,记得关闭连接。
总结
整表读取导入更新,sqlFetch(),sqlSave(),sqlUpdate()函数;
复杂读取导入更新,使用sqlQuery()函数进行sql语句查询;
复制表,sqlCopyTable()函数;
- 洛谷P1313 计算系数【快速幂+dp】
- python接口自动化5-Json数据处理
- Numpy教程第1部分 - 阵列简介(常用基础操作总结)
- Session和Cookies的基本原理
- 浅析Numpy.genfromtxt及File I/O讲解
- 损失函数详解
- 排查Java的内存问题
- 使用两种方法让 ASP.NET Core 实现遵循 HATEOAS 结构的 RESTful API
- 设计模式六大原则(5):迪米特法则
- Selenium2+python自动化61-Chrome浏览器(chromedriver)
- 区块链可以减少社会不平等吗?
- 【干货】不止准确率:为分类任务选择正确的机器学习度量指标(附代码实现)
- python爬虫beautifulsoup4系列1
- 区块链入门教程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring中AOP相关的API及源码解析,原来AOP是这样子的
- 状态管理之Vuex (一) 基操勿六
- 形式化分析工具(五)使用CAS +语法轻松编写HLPSL规范
- 你知道Spring是怎么将AOP应用到Bean的生命周期中的吗?
- 太实用了!自己动手写软件——密码验证器的界面实现
- 【TBase开源版测评】深度测评TBase的shard分片和冷热分离存储特性
- Python爬虫练手,一个简单的Python资讯采集案例
- 直播带货软件开发过程中,如何实现图片上传
- 太实用了!自己动手写软件——邮件用户名密码验证
- 太实用了!自己动手写软件——SSH、FTP和SQL server的密码破解
- Kaggle Tweet Sentiment Extraction 第七名复盘
- 【翻译】.NET 5中的性能改进
- 腾讯云实时语音识别-iOS SDK
- JointPoint用法及与ProceedingJoinPoint 的关系
- Spring中的异步请求、异步调用及demo测试