Fetch the next n
elements (rows) from the result set and return them
as a data.frame.
Methods in other packages
This documentation page describes the generics. Refer to the documentation pages linked below for the documentation for the methods that are implemented in various backend packages.
adbi::dbFetch("AdbiResult", "ANY")
AzureKusto::dbFetch("AzureKustoResult", "ANY")
bigrquery::dbFetch("BigQueryResult", "ANY")
DatabaseConnector::dbFetch("DatabaseConnectorDbiResult", "ANY")
DatabaseConnector::dbFetch("DatabaseConnectorJdbcResult", "ANY")
dittodb::dbFetch("DBIMockResult", "ANY")
duckdb::dbFetch("duckdb_result", "ANY")
lazysf::dbFetch("SFSQLResult", "ANY")
odbc::dbFetch("OdbcResult", "ANY")
RAthena::dbFetch("AthenaResult", "ANY")
RMariaDB::dbFetch("MariaDBResult", "ANY")
RPostgres::dbFetch("PqResult", "ANY")
RSQLite::dbFetch("SQLiteResult", "ANY")
sergeant::dbFetch("DrillResult", "ANY")
sparklyr::dbFetch("DBISparkResult", "ANY")
Arguments
- res
An object inheriting from DBIResult, created by
dbSendQuery()
.- n
maximum number of records to retrieve per fetch. Use
n = -1
orn = Inf
to retrieve all pending records. Some implementations may recognize other special values.- ...
Other arguments passed on to methods.
Value
dbFetch()
always returns a data.frame with
as many rows as records were fetched and as many
columns as fields in the result set,
even if the result is a single value
or has one
or zero rows.
Passing n = NA
is supported and returns an arbitrary number of rows (at least one)
as specified by the driver, but at most the remaining rows in the result set.
Details
fetch()
is provided for compatibility with older DBI clients - for all
new code you are strongly encouraged to use dbFetch()
. The default
implementation for dbFetch()
calls fetch()
so that it is compatible with
existing code. Modern backends should implement for dbFetch()
only.
The data retrieval flow
This section gives a complete overview over the flow for the execution of queries that return tabular data as data frames.
Most of this flow, except repeated calling of dbBind()
or dbBindArrow()
,
is implemented by dbGetQuery()
, which should be sufficient
unless you want to access the results in a paged way
or you have a parameterized query that you want to reuse.
This flow requires an active connection established by dbConnect()
.
See also vignette("dbi-advanced")
for a walkthrough.
Use
dbSendQuery()
to create a result set object of class DBIResult.Optionally, bind query parameters with
dbBind()
ordbBindArrow()
. This is required only if the query contains placeholders such as?
or$1
, depending on the database backend.Optionally, use
dbColumnInfo()
to retrieve the structure of the result set without retrieving actual data.Use
dbFetch()
to get the entire result set, a page of results, or the remaining rows. Fetching zero rows is also possible to retrieve the structure of the result set as a data frame. This step can be called multiple times. Only forward paging is supported, you need to cache previous pages if you need to navigate backwards.Use
dbHasCompleted()
to tell when you're done. This method returnsTRUE
if no more rows are available for fetching.Repeat the last four steps as necessary.
Use
dbClearResult()
to clean up the result set object. This step is mandatory even if no rows have been fetched or if an error has occurred during the processing. It is good practice to useon.exit()
orwithr::defer()
to ensure that this step is always executed.
Failure modes
An attempt to fetch from a closed result set raises an error.
If the n
argument is not an atomic whole number
greater or equal to -1 or Inf, an error is raised,
but a subsequent call to dbFetch()
with proper n
argument succeeds.
Calling dbFetch()
on a result set from a data manipulation query
created by DBI::dbSendStatement()
can
be fetched and return an empty data frame, with a warning.
Specification
Fetching multi-row queries with one
or more columns by default returns the entire result.
Multi-row queries can also be fetched progressively
by passing a whole number (integer or
numeric)
as the n
argument.
A value of Inf for the n
argument is supported
and also returns the full result.
If more rows than available are fetched, the result is returned in full
without warning.
If fewer rows than requested are returned, further fetches will
return a data frame with zero rows.
If zero rows are fetched, the columns of the data frame are still fully
typed.
Fetching fewer rows than available is permitted,
no warning is issued when clearing the result set.
A column named row_names
is treated like any other column.
The column types of the returned data frame depend on the data returned:
integer (or coercible to an integer) for integer values between -2^31 and 2^31 - 1, with NA for SQL
NULL
valuesnumeric for numbers with a fractional component, with NA for SQL
NULL
valueslogical for Boolean values (some backends may return an integer); with NA for SQL
NULL
valuescharacter for text, with NA for SQL
NULL
valueslists of raw for blobs with NULL entries for SQL NULL values
coercible using
as.Date()
for dates, with NA for SQLNULL
values (also applies to the return value of the SQL functioncurrent_date
)coercible using
hms::as_hms()
for times, with NA for SQLNULL
values (also applies to the return value of the SQL functioncurrent_time
)coercible using
as.POSIXct()
for timestamps, with NA for SQLNULL
values (also applies to the return value of the SQL functioncurrent_timestamp
)
If dates and timestamps are supported by the backend, the following R types are used:
lubridate::Date for dates (also applies to the return value of the SQL function
current_date
)lubridate::POSIXct for timestamps (also applies to the return value of the SQL function
current_timestamp
)
R has no built-in type with lossless support for the full range of 64-bit or larger integers. If 64-bit integers are returned from a query, the following rules apply:
Values are returned in a container with support for the full range of valid 64-bit values (such as the
integer64
class of the bit64 package)Coercion to numeric always returns a number that is as close as possible to the true value
Loss of precision when converting to numeric gives a warning
Conversion to character always returns a lossless decimal representation of the data
See also
Close the result set with dbClearResult()
as soon as you
finish retrieving the records you want.
Other DBIResult generics:
DBIResult-class
,
dbBind()
,
dbClearResult()
,
dbColumnInfo()
,
dbGetInfo()
,
dbGetRowCount()
,
dbGetRowsAffected()
,
dbGetStatement()
,
dbHasCompleted()
,
dbIsReadOnly()
,
dbIsValid()
,
dbQuoteLiteral()
,
dbQuoteString()
Other data retrieval generics:
dbBind()
,
dbClearResult()
,
dbFetchArrow()
,
dbFetchArrowChunk()
,
dbGetQuery()
,
dbGetQueryArrow()
,
dbHasCompleted()
,
dbSendQuery()
,
dbSendQueryArrow()
Examples
con <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(con, "mtcars", mtcars)
# Fetch all results
rs <- dbSendQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")
dbFetch(rs)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#> 2 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#> 3 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
#> 4 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#> 5 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#> 6 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#> 7 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
#> 8 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#> 9 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
#> 10 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#> 11 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
dbClearResult(rs)
# Fetch in chunks
rs <- dbSendQuery(con, "SELECT * FROM mtcars")
while (!dbHasCompleted(rs)) {
chunk <- dbFetch(rs, 10)
print(nrow(chunk))
}
#> [1] 10
#> [1] 10
#> [1] 10
#> [1] 2
dbClearResult(rs)
dbDisconnect(con)