使用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]])
如果这样的话,您将能够重新执行查询。