连接数据库

news
code
analysis
数据库
Author

hcl

Published

September 21, 2022

建立R与postgres的连接

先加载 RPostgres 包,再用 dbConnect() 来建立连接,需要提供数据库后端、数据库名、用户名、密码

<PqResult>
  SQL  set search_path=public,mimic_core,mimic_hosp,mimic_icu;
  ROWS Fetched: 0 [complete]
       Changed: 0
 [1] "admissions"         "patients"           "transfers"         
 [4] "d_hcpcs"            "diagnoses_icd"      "d_icd_diagnoses"   
 [7] "d_icd_procedures"   "d_labitems"         "drgcodes"          
[10] "emar_detail"        "emar"               "hcpcsevents"       
[13] "labevents"          "microbiologyevents" "pharmacy"          
[16] "poe_detail"         "poe"                "prescriptions"     
[19] "procedures_icd"     "services"           "omr"               
[22] "chartevents"        "datetimeevents"     "d_items"           
[25] "icustays"           "inputevents"        "outputevents"      
[28] "procedureevents"    "ingredientevents"   "icd9_10"           

数据表引用

用函数 tbl() 获取数据表的引用,引用是一种浅拷贝机制,能够不做物理拷贝而使用数据,一般处理大数据都采用该策略。

df = tbl(con, "patients")
df 
# Source:   table<patients> [?? x 6]
# Database: postgres  [postgres@localhost:5432/mimiciv]
   subject_id gender anchor_age anchor_year anchor_year_group dod       
        <int> <chr>       <int>       <int> <chr>             <date>    
 1   10000032 F              52        2180 2014 - 2016       2180-09-09
 2   10000048 F              23        2126 2008 - 2010       NA        
 3   10000068 F              19        2160 2008 - 2010       NA        
 4   10000084 M              72        2160 2017 - 2019       2161-02-13
 5   10000102 F              27        2136 2008 - 2010       NA        
 6   10000108 M              25        2163 2014 - 2016       NA        
 7   10000115 M              24        2154 2017 - 2019       NA        
 8   10000117 F              48        2174 2008 - 2010       NA        
 9   10000178 F              59        2157 2017 - 2019       NA        
10   10000248 M              34        2192 2014 - 2016       NA        
# … with more rows

输出数据表引用,看起来和 tibble 几乎一样,主要区别就是它是来自远程 postgres 数据库。

数据表查询

与数据库交互,通常是用 SQL(结构化查询语言),几乎所有的数据库都在使用 SQL。 dbplyr 包让 R 用户用 dplyr 语法就能执行 SQL 查询,就像用在 R 中操作数据框一样:

df %>% filter( gender == "M" & anchor_age == 52)
# Source:   SQL [?? x 6]
# Database: postgres  [postgres@localhost:5432/mimiciv]
   subject_id gender anchor_age anchor_year anchor_year_group dod       
        <int> <chr>       <int>       <int> <chr>             <date>    
 1   10005428 M              52        2143 2008 - 2010       NA        
 2   10005808 M              52        2118 2011 - 2013       NA        
 3   10006053 M              52        2111 2014 - 2016       2111-11-15
 4   10007920 M              52        2132 2008 - 2010       NA        
 5   10013049 M              52        2114 2011 - 2013       NA        
 6   10017852 M              52        2158 2008 - 2010       NA        
 7   10018599 M              52        2112 2017 - 2019       NA        
 8   10020435 M              52        2146 2014 - 2016       NA        
 9   10032876 M              52        2138 2014 - 2016       NA        
10   10033143 M              52        2137 2008 - 2010       NA        
# … with more rows

当与数据库一起工作时, dplyr 试图尽可能地懒惰:

  • 除非明确要求(接 collect()),否则它不会把数据拉到 R 中
  • 它把任何工作都尽可能地推迟到最后一刻:把想做的所有事情合在一起,然后一步送到数据库中
  • dbplyr 包还提供了将 dplyr 代码翻译成 SQL 查询代码的函数 show_query(). 可以进一步用于 MySQL, 或 dbSendQuery(), dbGetQuery()
df %>% filter( gender == "M" & anchor_age == 52) %>% show_query()
<SQL>
SELECT *
FROM "patients"
WHERE ("gender" = 'M' AND "anchor_age" = 52.0)

最后,关闭连接。

dbDisconnect(con)
鄂ICP备2022016232号-1