使用R连接到PostgreSQL

> install.packages('RPostgreSQL')
> library(RPostgreSQL)
> con <- dbConnect(PostgreSQL(), host="localhost", > port=5432, user= "postgres", password="*****", dbname="db_name")
> dbListTables(con)  # テーブル一覧取得
> dbListFields(con, "users")  # usersテーブルのカラム名一覧取得

执行查询并获取数据框

> con <- dbConnect(PostgreSQL(), host="localhost", port=5432, user="aikawa", password="", dbname="wantedly")
> light_query <- "SELECT * FROM users LIMIT 4"
> data <- dbGetQeury(con, light_query)
> heavy_query <- "SELECT * FROM users"
> rs <- dbSendQuery(con, heavy_query)
> summary(rs)
<PostgreSQLResult:(10272,0,11)> 
  Statement: SELECT * FROM users 
  Has completed? no 
  Affected rows: -1 
  Rows fetched: 0 
> data <- fetch(rs)
> nrow(data)  # 全体はもっと多いのに500行しか取得しない
[1] 500
>  summary(rs)  # summaryはrow fetchedが500になっている
<PostgreSQLResult:(10272,0,11)> 
  Statement: SELECT * FROM users 
  Has completed? no 
  Affected rows: -1 
  Rows fetched: 500 
> data <- fetch(rs)  # 次の500件を取得
> data <- fetch(rs, n=1000)  # 次の1000件, n=-1で全て取得

错误处理

当在`dbSendQuery`函数中获取结果却没有完全获取(fetch)之前(即`dbHasCompleted(rs)`为FALSE之前),执行`dbSendQuery`等查询操作。

 Error in postgresqlExecStatement(conn, statement, ...) : 
  RS-DBI driver: (connection with pending rows, close resultSet before continuing)

若出现这样的情况,

dbClearResult(rs)

如果不将其放入变量中,例如rs等,则

要让其它自然中文的回答,就请你重新向我提问!

dbClearResult(dbListResults(con)[[1]])

如果这样的话,您将能够重新执行查询。

引用