• R之RMySQL


    linux,mysql和R的版本信息:

    • Linux naci 3.19.0-16-generic #16-Ubuntu SMP
    • Server version: 5.6.24-0ubuntu2 (Ubuntu)
    • R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"

    mysql的linux安装,参照上一篇关于liunx下安装mysql的文章。

    1. 安装RMySQL包

    在装RMySQL包之前,确定电脑上装了libmysqlclient-dev,否则在安装时会出现错误。

    ~$ sudo apt-get install libmysqlclient-dev              #安装客户端的开发支持
    ~$ R
    > install.packages("RMySQL","/home/beili/R/packages") #安装RMySQL包
    > .libPaths(RMySQL)

    2.RMySQL支持的相关函数

    辅助函数
    
        2.1 dbConnect,dbDisconnect  #数据库连接函数
        2.2 dbListFields ,dbListTables,dbGetInfo,dbListResults,summary,dbGetException,dbExistsTable    #查看数据库或者参数信息
    
    查询函数
    
        2.3 dbGetQuery    #查询函数
        2.4 dbReadTable   #读取表的数据
    
    更新函数
    
        2.5 dbWriteTable   #创建数据库表或者将数据写入对应的表
        2.6 dbRemoveTable  # 删除数据库中的表
    
    dbSendQuery函数
    
        2.7 dbSendQuery ,dbClearResult  #将query交给数据库引擎
        2.8 dbColumnInfo,dbGetRowsAffected,dbGetRowCount,dbHasCompleted     #查看数据库引擎执行结果
        2.9 dbFetch,fetch   #将dbSendQuery函数的结果抽取出来
        2.10 dbNextResult,dbMoreResults   #一条一条读取结果
    
    事务函数
    
        2.11 dbCommit,dbBegin,dbRollback 

    2.1 dbConnect和dbDisconnect函数

    函数调用格式如下:

    dbConnect(drv, dbname,username,password ,host,port,client.flag=CLIENT_MULTI_STATEMENTS..) 
    dbDisconnect(conn, ...)

    注:client.flag=CLIENT_MULTI_STATEMENTS表示客户端允许执行多个statement。

    由于和传统的设置参数差不多,所以下面直接看例子:

    > conn=dbConnect(MySQL(),dbname="test",username="root",password="mdcl")  #建立连接
    > summary(conn,verbose=T)                                                #查看连接信息
    <MySQLConnection:0,0>
    User: root Host: localhost Dbname: test Connection type: Localhost via UNIX socket MySQL server version: 5.6.24-0ubuntu2 MySQL client version: 5.6.24 MySQL protocol version: 10 MySQL server thread id: 4 Results:
    > dbDisconnect(conn) #关闭连接

     注:本地连接不用设置host和port,另外summary属于RMySQL的函数,是S4类,用户mysql驱动的信息

    2.2 dbListFields ,dbListTables,dbGetInfo,dbListResults,summary,dbGetException查看数据库或者参数信息

    函数调用格式如下:

    dbListFields(conn, name, ...)        #查看表的字段信息
    dbListTables(conn, ...) #查看数据库下表
    dbGetInfo(dbObj, what = "", ...) #获取mysql数据变量的信息,what指定得到list中的哪个值
    dbListResults(conn, ...) #列出conn的查询结果
    summary(object, verbose = FALSE, ...)#查看某个变量的相信信息
    dbGetException(conn, ...) #查看conn的异常信息
    dbExistsTable(conn, name, ...)

    例如:

    > dbListFields(conn,"people")
    [1] "name" "sex"  "age" 
    > dbListTables(conn)
    [1] "people"
    > dbGetInfo(conn)
    $host
    [1] "localhost"

    $user
    [1] "root"

    $dbname
    [1] "test"
    ...

    > dbListResults(conn)
    list()
    > dbGetException(conn)
    $errorNum
    [1] 0

    $errorMsg
    [1] ""
    > dbExistsTable(conn, "people")
    [1] TRUE

    2.3 dbGetQuery 数据库查询

          dbGetQuery实际要执行一连串的动作,在内部实际上会执行dbSendQuery函数,然后当dbHasCompleted为TRUE之后,又自动fetch出返回的结果,最后由on.exit保证执行dbClearResult。该函数支持各种各样的query,当执行select操作时,返回data.frame类型的结果;当执行insert/update操作时,返回NULL。

    函数调用格式:

    dbGetQuery(conn, statement, ...)

    例子:

    > res=dbGetQuery(conn,"select * from people")
    > class(res)
    [1] "data.frame"
    > res
      name sex age
    1  bao   M  12
    2 qiao   M  12
    > dbGetQuery(conn,"show tables")
      Tables_in_test
    1         people
    2            stu
    3        student
    > dbGetQuery(conn,"drop table student")
    NULL
    > dbGetQuery(conn,"show tables")
      Tables_in_test
    1         people
    2            stu

    2.4 dbReadTable 读取整个表的数据

    调用格式:

    dbReadTable(conn, name, row.names,check.names = TRUE, ...)

    其中 row.names=k,表示第k列作为每一行的名字。

    例子:

    > dbReadTable(conn,"stu",row.names=1)
       stuid name age
    1      1 qiao  51
    2      2  bao  27
    3      3 qiao   1
    4      4  bao  26

    2.5 dbWriteTable 将数据写入数据库

    调用格式:

     dbWriteTable(conn, name, value, row.names=T,overwrite,append,...)

    其中row.names表示是否将row.names写入数据库的,作为单独的一列;overwrite=T表示会覆盖掉原先的数据;append=T表示在原先的数据后面进行插入。

    例子:

    > dbGetQuery(conn,"truncate table stu")
    NULL
    > dbReadTable(conn,"stu",row.names=1)
    [1] stuid name  age  
    <0 > (或0-长度的row.names)
    > dbWriteTable(conn,"stu",student,append=T)
    [1] TRUE
    > dbReadTable(conn,"stu",row.names=1)
       stuid name age
    1      1 qiao  51
    2      2  bao  27
    3      3 qiao   1
    4      4  bao  26

    2.6 dbRemoveTable  删除表实际上执行了“Drop table name”的命令,在2.3中给出了drop的例子。

    调用格式:

    dbRemoveTable(conn,name)

    例子:

    > dbListTables(conn)
    [1] "people" "stu"   
    > dbRemoveTable(conn,"people")
    [1] TRUE
    > dbListTables(conn)
    [1] "stu"

    2.7 dbSendQuery ,dbClearResult

    • dbSendQuery函数提交查询,并在服务器那端同步执行,但是并不抽取其中的结果,因此需要配合dbFetch来使用,最后抽取完毕之后,使用dbClearResult来清洗返回的结果。既然有了dbReadTable函数了,为什么还要有dbSendQuery呢?如果需要返回的数据很大的情况下,而R又装不下,如果使用dbReadTable那么铁定不行了。dbSendQuery函数来说,DBMS执行了query语句,可能生成了大量的数据,不同的数据库驱动可能有不同的处理方式,有的存储在服务器端,一点一点发给R;有的传给客户端,但是不会一下子传给R。
    • dbClearResult函数释放占用的资源。

    调用格式:

    dbSendQuery(conn, statement)
    dbClearResult(res, ...)

    如果dbConnect中client.flag没有设置下,只能执行一条statement,而且不dbClearResult执行的res是不能再执行dbSendQuery函数的,也就是说正确的执行方式如下:

    rs1=dbSendQuery(conn, statement)
    ...
    dbClearResult(rs1, ...)
    rs2=dbSendQuery(conn, statement)
    ...
    dbClearResult(rs2, ...)

    而下面的调用格式是错的:

    rs1=dbSendQuery(conn, statement)
    rs2=dbSendQuery(conn, statement)
    ... dbClearResult(rs1, ...) dbClearResult(rs2, ...)

    例子:

    > res=dbSendQuery(conn,"select * from stu")
    > dbGetInfo(res)
    $statement
    [1] "select * from stu"
    
    $isSelect
    [1] 1
    
    $rowsAffected
    [1] -1
    
    $rowCount
    [1] 0
    
    $completed
    [1] 0
    
    $fieldDescription
    $fieldDescription[[1]]
    NULL
    
    
    > res2=dbSendQuery(conn,"select * from stu")
    错误于.local(conn, statement, ...) : 
      connection with pending rows, close resultSet before continuing
    > dbClearResult(res)
    [1] TRUE
    > res2=dbSendQuery(conn,"select * from stu")

    2.8 dbColumnInfo,dbGetRowsAffected,dbGetRowCount,dbHasCompleted

     这一系列的函数,其实是dbSendQuery的辅助函数,得到的信息,使用dbGetInfo(res)都能得到。

    重点说一下dbHasCompleted函数,函数含义是服务器端的数据是否被抽取完毕:

    调用格式:

    dbHasCompleted(res,...)

    注:只有查询的数据全部被R抽取完,该函数才能返回TRUE值,具体使用见2.9中的例子。

    2.9 dbFetch,fetch

    fetch是比较老的一个版本,dbFetch和fetch功能相同,不过比较鼓励使用dbFetch。

    调用格式:

    dbFetch(res,n,...)
    ftch(res,n,)

    注:n表示读取的行数,当n=-1时,表示全部抽取。

    例子:

    > dbWriteTable(conn, "mtcars", mtcars)
    [1] TRUE
    
    > res <- dbSendQuery(conn, "SELECT * FROM mtcars WHERE cyl = 4")
    > dbFetch(res)
            row_names  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    1      Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
    2       Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    3        Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
    4        Fiat 128 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
    5     Honda Civic 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
    6  Toyota Corolla 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
    7   Toyota Corona 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    8       Fiat X1-9 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    9   Porsche 914-2 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
    10   Lotus Europa 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    11     Volvo 142E 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
    > dbClearResult(res)
    [1] TRUE
    
    > res <- dbSendQuery(conn, "SELECT * FROM mtcars")
    > while (!dbHasCompleted(res)) {
    +        chunk <- fetch(res, 10)
    +        print(nrow(chunk))
    +      }
    [1] 10
    [1] 10
    [1] 10
    [1] 2
    > dbClearResult(res)   
    [1] TRUE

    2.10 dbNextResult,dbMoreResults

    • dbMoreResults是针对多个query statement来说的,如果还有额外的结果集需要处理,则返回TRUE,否则返回FALSE
    • dbNextResult 接着处理下一个statement的结果集。

    调用格式:

    dbNextResult(con, ...)
    dbMoreResult(con,...)

    例子:

    > con=dbConnect(MySQL(),dbname="test",username="root",password="mdcl",client.flag=CLIENT_MULTI_STATEMENTS)
    > dbListTables(con)
    [1] "mtcars" "stu"   
    > sql <- "SELECT cyl FROM mtcars LIMIT 5; SELECT vs FROM mtcars LIMIT 5"
    > rs1 <- dbSendQuery(con, sql)
    > dbFetch(rs1, n = -1)
      cyl
    1   6
    2   6
    3   4
    4   6
    5   8
    if (dbMoreResults(con)) {
    +         rs2 <- dbNextResult(con)
    +         dbFetch(rs2, n = -1)
    +      }
      vs
    1  0
    2  0
    3  1
    4  1
    5  0
    dbClearResult(rs1)
    [1] TRUE
    dbClearResult(rs2)
    [1] TRUE

    2.11 dbCommit ,dbBegin,dbRollback

     三个事务函数,和数据库中的概念是一致的。

    调用方式:

      dbBegin(conn, ...)   
      dbCommit(conn, ...)
      dbRollback(conn, ...)
  • 相关阅读:
    JavaScript和DOM
    CSS补充以及后台页面布局
    HTML标签和CSS基础
    基于SQLAlchemy实现的堡垒机
    PymySQL
    SQLAlchemy
    负数取模
    list
    算法(3)
    python初识(3)
  • 原文地址:https://www.cnblogs.com/wzyj/p/4519924.html
Copyright © 2020-2023  润新知