Skip to contents

copy_dm_to() takes a dplyr::src_dbi object or a DBI::DBIConnection object as its first argument and a dm object as its second argument. The latter is copied to the former. The default is to create temporary tables, set temporary = FALSE to create permanent tables. Unless set_key_constraints is FALSE, primary key constraints are set on all databases, and in addition foreign key constraints are set on MSSQL and Postgres databases.


  types = NULL,
  overwrite = NULL,
  indexes = NULL,
  unique_indexes = NULL,
  set_key_constraints = TRUE,
  unique_table_names = NULL,
  table_names = NULL,
  temporary = TRUE,
  schema = NULL,
  progress = NA,
  copy_to = NULL



An object of class "src" or "DBIConnection".


A dm object.


Passed on to dplyr::copy_to() or to the function specified by the copy_to argument.

overwrite, types, indexes, unique_indexes

Must remain NULL.


If TRUE will mirror dm primary and foreign key constraints on a database and create unique indexes. Set to FALSE if your data model currently does not satisfy primary or foreign key constraints.




Desired names for the tables on dest; the names within the dm remain unchanged. Can be NULL, a named character vector, a function or a one-sided formula.

If left NULL (default), the names will be determined automatically depending on the temporary argument:

  1. temporary = TRUE (default): unique table names based on the names of the tables in the dm are created.

  2. temporary = FALSE: the table names in the dm are used as names for the tables on dest.

If a function or one-sided formula, table_names is converted to a function using rlang::as_function(). This function is called with the unquoted table names of the dm object as the only argument. The output of this function is processed by DBI::dbQuoteIdentifier(), that result should be a vector of identifiers of the same length as the original table names.

Use a variant of table_names = ~ DBI::SQL(paste0("schema_name", ".", .x)) to specify the same schema for all tables. Use table_names = identity with temporary = TRUE to avoid giving temporary tables unique names.

If a named character vector, the names of this vector need to correspond to the table names in the dm, and its values are the desired names on dest. The value is processed by DBI::dbQuoteIdentifier(), that result should be a vector of identifiers of the same length as the original table names.

Use qualified names corresponding to your database's syntax to specify e.g. database and schema for your tables.


If TRUE, only temporary tables will be created. These tables will vanish when disconnecting from the database.


Name of schema to copy the dm to. If schema is provided, an error will be thrown if temporary = FALSE or table_names is not NULL.

Not all DBMS are supported.


Whether to display a progress bar, if NA (the default) hide in non-interactive mode, show in interactive mode. Requires the 'progress' package.


By default, dplyr::copy_to() is called to upload the individual tables to the target data source. This argument allows overriding the standard behavior in cases when the default does not work as expected, such as spatial data frames or other tables with special data types. If not NULL, this argument is processed with rlang::as_function().


A dm object on the given src with the same table names as the input dm.


No tables will be overwritten; passing overwrite = TRUE to the function will give an error. Types are determined separately for each table, setting the types argument will also throw an error. The arguments are included in the signature to avoid passing them via the ... ellipsis.


con <- DBI::dbConnect(RSQLite::SQLite())

# Copy to temporary tables, unique table names by default:
temp_dm <- copy_dm_to(
  set_key_constraints = FALSE

# Persist, explicitly specify table names:
persistent_dm <- copy_dm_to(
  temporary = FALSE,
  table_names = ~ paste0("flights_", .x)
#> <IDENT> flights_planes