R操作关系型数据库

基本要求: R语言基础,懂得一定SQL语法, 懂得使用搜索引擎
目标: 学会使用DBI操作SQLite数据库

简介

R本身不具备数据库操作能力,需要额外的扩展包--DBI(database interface)。DBI将数据库管理分为前端和后端。用户在前端使用对应的API, 经由DBI转换成相应的底层操作.
DBI分为三个部分:

  • 数据库驱动, 负责与数据库进行交互,比如说与SQLite数据库交互要用到RSQLite,如果是MYSQL,则是RMYSQL
  • 连接对象,建立与数据库的连接,前端操作经由该连接完成
  • 结果, 操作的结果在这里显示
DBI结构

具体操作

首先加载R包

library(DBI)
library(RSQLite)

第一步: 连接或创建数据库:dbConnect ,建立连接对象,后续的操作都基于该对象。

常用命令为:dbExecutedbSendStatement, 前者适用于数据量不大时,后者适用数据量较大时

# 新建或连接已有的磁盘上数据库
con <- dbConnect(RSQLite::SQLite(), 'test.db')
# 临时在内存中建立
con <- dbConnect(RSQLite::SQLite(), ":memory:")

参数1: 数据库驱动引擎(RSQLite::SQLite());
参数2: 数据库连接参数(如user, password, host, port, dbname),SQLite只需要提供数据库命名(不存在则新建),:memory: 则表示在仅保存在内存中.

第二步: 在R上实现数据库的常用操作: 增删改查

:建立表并增加记录

# 导入已有的数据框, 参数为“连接对象, 表名,数据框”
dbWriteTable(con, 'mtcar', mtcars )
# 建立新表
dbExecute(con, 'CREATE TABLE test (name char(10), age int(10))')
dbExecute(con, 'INSERT INTO test (name, age) VALUES ("Tom", 25), ("Jelly",26)')
# 数据量过大,可以批次插入
rs <- dbSendStatement(con, 'INSERT INTO test (name, age) VALUES ("Tom", 25), ("Jelly",26)' )
dbHasCompleted(rs) # 判断操作是否完成
dbGetRowAffected(rs) # 返回影响的行
dbClearResult(rs) # 清空内存

: 有两种方法, 一类获取所有数据,一类分批获取数据

# 方法1
dbGetQuery(con, 'SELECT * FROM test')
# 方法2
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "mtcars", mtcars)
rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4;")
dbFetch(rs, n=10) # 获取10行
dbFetch(rs, n=10) # 再获取10行
dbClearResult(rs) # 清空rs句柄中的内容
dbDisconnect(con)

: 删除记录

# 删除记录前,要先查询
dbGetQuery(con, 'SELECT * FROM mtcar WHERE mpg > 30')
# 删除记录
dbExecute(con, 'DELETE FROM mtcar WHERE mpg > 30')
# 删除所有记录,谨慎操作
dbExecute(con, 'DROP TABLE test')
dbRemoveTable(con, 'test')

: 修改记录

# 修改记录前也是先查找
dbGetQuery(con, 'SELECT * FROM mtcar WHERE am ==1')
# 然后我们将mpg=21,且qsec=16.46 记录 的mpg修改为21.1
dbExecute(con, 'UPDATE mtcar SET mpg = 21.1 WHERE mpg =21.0 AND qsec =16.46')
# 事后验证
dbGetQuery(con, 'SELECT * FROM mtcar WHERE mpg = 21.1')

一般而言,增查改删操作最好能够有反悔药。dbBegin(con)会记录一系列操作,直到你呈交修改dbCommit(con)回滚修改dbRollback(con)

con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "cash", data.frame(amount = 100))
# 测试dbCommit
dbBegin(con)
withdrawal <- 300
dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal))
dbCommit(con)
# 测试回滚
dbBegin(con)
withdrawl <- 5000
dbExecute(con, "UPDATE cash SET amount = amount + ?", list(withdrawal))
## 查看结果
dbGetQuery(con,'SELECT * FROM cash')
## 回滚
dbRollback(con)
## 检查结果
dbGetQuery(con,'SELECT * FROM cash')

所有操作完毕,结束连接dbDisconnect(con)

下面一些命令也比较常用,用法比较简单。

  • dbWriteTable(连接对象, 表名, 数据框): 将数据框保存为表
  • dbReadTable(连接对象, 表名 ): 读取指定表中所有内容
  • dbListTable(连接对象): 列出数据库中包含的表格
  • dbListFields(连接对象, 表名): 列出制定表格列名
  • dbReadTable(连接对象, 表名): 将指定表读取为数据框

最后感言:感谢自己大学时候看过几本SQL语法书,虽然忘得差不多了。

R:关系型数据库管理相关推荐

  1. 关系型数据库管理系统和SQL介绍

    1. 关系型数据库管理系统的介绍 数据库管理系统(英语全拼:Relational Database Management System,简称RDBMS)是为管理关系型数据库而设计的软件系统,如果大家想 ...

  2. PHP框架的ORM思想:O类的实例化 R数据表 M映射XML

    定义 对象关系映射(Object Relational Mapping),用OOP的方式实现与不同数据库的CURDO(对象模型):实体对象,即我们在程序中根据数据库表结构建立的一个个实体Entity. ...

  3. 关系型数据库是什么?

    关系型数据库建立在关系型数据模型的基础上,是借助于集合代数等数学概念和方法来处理数据的数据库.现实世界中的各种实体以及实体之间的各种联系均可用关系模型来表示,市场上占很大份额的 Oracle.MySQ ...

  4. 了解数据库的作用、特点及关系型数据库管理系统

    学习目标 能够知道数据库的作用数据库和数据库管理系统的关系 一.数据库 1. 数据库的介绍 数据库就是存储和管理数据的仓库,数据按照一定的格式进行存储,用户可以对数据库中的数据进行增加.修改.删除.查 ...

  5. 大白话关系型数据库:索引,事务,锁

    感谢阅读.也欢迎大家可以去看<MySQL技术内幕>和橘黄色的<算法>. 前言 数据库是软件开发的核心,因为一个软件如果要有状态,也就是它记得你什么时候操作过什么,那么数据要持久 ...

  6. asp毕业设计——基于asp+access的网上投票系统设计与实现(毕业论文+程序源码)——网上投票系统

    基于asp+access的网上投票系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的网上投票系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. 文章目录 ...

  7. mysql commit work_数据库commit work

    事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句 事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作. ...

  8. Linux实战教学笔记28:企业级LNMP环境应用实践

    一,LNMP应用环境 1.1 LNMP介绍 大约在2010年以前,互联网公司最常用的经典Web服务环境组合就是LAMP(即Linux,Apache,MySQL,PHP),近几年随着Nginx Web服 ...

  9. SQL由入门到精通的学习

    SQL 21 日自学通(V1.0) 翻译人笨猪 EMAIL wyhsillypig@163.com 1 目录 目录........................................... ...

最新文章

  1. JMM内存模型如何为并发保驾护航
  2. 读取exchange邮件的未读数(转载)
  3. Elastic发布K8s部署和控制数据管理工具官方解决方案
  4. java实体类转map_十五道经典面试题-JAVA基础篇
  5. Oracle中dmp/dmpdp导出,imp/impdp导入
  6. JDBC_ResultSet类_结果集对象
  7. java索引丢失怎么解决_java.sql.SQLException: 索引中丢失 IN 或 OUT 参数:: 1解决办法...
  8. JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)...
  9. 未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“***Form.resources”正确嵌入或链接到程序集“***”。。。
  10. php旧物交易开源代码_仿互站PHP源码 虚拟物品在线交易网站源码 附14套风格
  11. [转载]JXTA概念介绍
  12. java需要知道哪些英语单词_70个学习JAVA必背的英语单词,了解下
  13. linux 文件名 自动补全,用Linux自动补全怎么补全命令?
  14. 使用do文件进行仿真时出现“failed tofind ‘glbl’in hierarchical name ‘/glbl/GSR‘“的解决办法
  15. 左手系与右手系 图片理解
  16. 普元mobile_普元Primeton Mobile 7.1 正式发布 互联网集成能力加速企业数字化转型
  17. 绕流运动与附面层基本概念
  18. 提取ansible hosts分组IP
  19. ide项目文件夹浅黄色编写代码无提示或看不到项目中的文件夹
  20. 2021-05-16

热门文章

  1. 探索 | 神经网络到底是如何思考的?MIT精英们做了这么一个实验室来搞清楚
  2. 十年后,这款优秀的工具终于给出了不开源的原因
  3. 解读Java 8 中为并发而生的 ConcurrentHashMap
  4. Spring Boot集成Sharding-jdbc + Mybatis-Plus实现分库分表
  5. 83篇文献-万字总结强化学习之路
  6. 体重18公斤北航新生报到!高考645分,立志改变世界“做中国的霍金”
  7. 让人脸识别算法失灵,还能抵抗微信微博照片压缩!武大Adobe提出抗压缩对抗新框架,成功率最高超90%...
  8. 恕我直言,有了这款IDEA插件,你可能只需要写30%的代码...
  9. 深度学习-强化学习-图神经网络-自然语言处理等AI课程超级大列表-最新版
  10. 百度李彦宏遭现场泼水,瞬间懵圈,湿身调侃AI遇到的挫折