--- layout: docu title: Appender --- Appenders are the most efficient way of loading data into DuckDB from within the C interface, and are recommended for fast data loading. The appender is much faster than using prepared statements or individual `INSERT INTO` statements. Appends are made in row-wise format. For every column, a `duckdb_append_[type]` call should be made, after which the row should be finished by calling `duckdb_appender_end_row`. After all rows have been appended, `duckdb_appender_destroy` should be used to finalize the appender and clean up the resulting memory. Note that `duckdb_appender_destroy` should always be called on the resulting appender, even if the function returns `DuckDBError`. ## Example ```c duckdb_query(con, "CREATE TABLE people (id INTEGER, name VARCHAR)", NULL); duckdb_appender appender; if (duckdb_appender_create(con, NULL, "people", &appender) == DuckDBError) { // handle error } // append the first row (1, Mark) duckdb_append_int32(appender, 1); duckdb_append_varchar(appender, "Mark"); duckdb_appender_end_row(appender); // append the second row (2, Hannes) duckdb_append_int32(appender, 2); duckdb_append_varchar(appender, "Hannes"); duckdb_appender_end_row(appender); // finish appending and flush all the rows to the table duckdb_appender_destroy(&appender); ``` ## API Reference Overview
duckdb_state duckdb_appender_create(duckdb_connection connection, const char *schema, const char *table, duckdb_appender *out_appender);
duckdb_state duckdb_appender_create_ext(duckdb_connection connection, const char *catalog, const char *schema, const char *table, duckdb_appender *out_appender);
idx_t duckdb_appender_column_count(duckdb_appender appender);
duckdb_logical_type duckdb_appender_column_type(duckdb_appender appender, idx_t col_idx);
const char *duckdb_appender_error(duckdb_appender appender);
duckdb_state duckdb_appender_flush(duckdb_appender appender);
duckdb_state duckdb_appender_close(duckdb_appender appender);
duckdb_state duckdb_appender_destroy(duckdb_appender *appender);
duckdb_state duckdb_appender_add_column(duckdb_appender appender, const char *name);
duckdb_state duckdb_appender_clear_columns(duckdb_appender appender);
duckdb_state duckdb_appender_begin_row(duckdb_appender appender);
duckdb_state duckdb_appender_end_row(duckdb_appender appender);
duckdb_state duckdb_append_default(duckdb_appender appender);
duckdb_state duckdb_append_default_to_chunk(duckdb_appender appender, duckdb_data_chunk chunk, idx_t col, idx_t row);
duckdb_state duckdb_append_bool(duckdb_appender appender, bool value);
duckdb_state duckdb_append_int8(duckdb_appender appender, int8_t value);
duckdb_state duckdb_append_int16(duckdb_appender appender, int16_t value);
duckdb_state duckdb_append_int32(duckdb_appender appender, int32_t value);
duckdb_state duckdb_append_int64(duckdb_appender appender, int64_t value);
duckdb_state duckdb_append_hugeint(duckdb_appender appender, duckdb_hugeint value);
duckdb_state duckdb_append_uint8(duckdb_appender appender, uint8_t value);
duckdb_state duckdb_append_uint16(duckdb_appender appender, uint16_t value);
duckdb_state duckdb_append_uint32(duckdb_appender appender, uint32_t value);
duckdb_state duckdb_append_uint64(duckdb_appender appender, uint64_t value);
duckdb_state duckdb_append_uhugeint(duckdb_appender appender, duckdb_uhugeint value);
duckdb_state duckdb_append_float(duckdb_appender appender, float value);
duckdb_state duckdb_append_double(duckdb_appender appender, double value);
duckdb_state duckdb_append_date(duckdb_appender appender, duckdb_date value);
duckdb_state duckdb_append_time(duckdb_appender appender, duckdb_time value);
duckdb_state duckdb_append_timestamp(duckdb_appender appender, duckdb_timestamp value);
duckdb_state duckdb_append_interval(duckdb_appender appender, duckdb_interval value);
duckdb_state duckdb_append_varchar(duckdb_appender appender, const char *val);
duckdb_state duckdb_append_varchar_length(duckdb_appender appender, const char *val, idx_t length);
duckdb_state duckdb_append_blob(duckdb_appender appender, const void *data, idx_t length);
duckdb_state duckdb_append_null(duckdb_appender appender);
duckdb_state duckdb_append_value(duckdb_appender appender, duckdb_value value);
duckdb_state duckdb_append_data_chunk(duckdb_appender appender, duckdb_data_chunk chunk);
duckdb_state duckdb_appender_create(
duckdb_connection connection,
const char *schema,
const char *table,
duckdb_appender *out_appender
);
duckdb_state duckdb_appender_create_ext(
duckdb_connection connection,
const char *catalog,
const char *schema,
const char *table,
duckdb_appender *out_appender
);
idx_t duckdb_appender_column_count(
duckdb_appender appender
);
duckdb_logical_type duckdb_appender_column_type(
duckdb_appender appender,
idx_t col_idx
);
const char *duckdb_appender_error(
duckdb_appender appender
);
duckdb_state duckdb_appender_flush(
duckdb_appender appender
);
duckdb_state duckdb_appender_close(
duckdb_appender appender
);
duckdb_state duckdb_appender_destroy(
duckdb_appender *appender
);
duckdb_state duckdb_appender_add_column(
duckdb_appender appender,
const char *name
);
duckdb_state duckdb_appender_clear_columns(
duckdb_appender appender
);
duckdb_state duckdb_appender_begin_row(
duckdb_appender appender
);
duckdb_state duckdb_appender_end_row(
duckdb_appender appender
);
duckdb_state duckdb_append_default(
duckdb_appender appender
);
duckdb_state duckdb_append_default_to_chunk(
duckdb_appender appender,
duckdb_data_chunk chunk,
idx_t col,
idx_t row
);
duckdb_state duckdb_append_bool(
duckdb_appender appender,
bool value
);
duckdb_state duckdb_append_int8(
duckdb_appender appender,
int8_t value
);
duckdb_state duckdb_append_int16(
duckdb_appender appender,
int16_t value
);
duckdb_state duckdb_append_int32(
duckdb_appender appender,
int32_t value
);
duckdb_state duckdb_append_int64(
duckdb_appender appender,
int64_t value
);
duckdb_state duckdb_append_hugeint(
duckdb_appender appender,
duckdb_hugeint value
);
duckdb_state duckdb_append_uint8(
duckdb_appender appender,
uint8_t value
);
duckdb_state duckdb_append_uint16(
duckdb_appender appender,
uint16_t value
);
duckdb_state duckdb_append_uint32(
duckdb_appender appender,
uint32_t value
);
duckdb_state duckdb_append_uint64(
duckdb_appender appender,
uint64_t value
);
duckdb_state duckdb_append_uhugeint(
duckdb_appender appender,
duckdb_uhugeint value
);
duckdb_state duckdb_append_float(
duckdb_appender appender,
float value
);
duckdb_state duckdb_append_double(
duckdb_appender appender,
double value
);
duckdb_state duckdb_append_date(
duckdb_appender appender,
duckdb_date value
);
duckdb_state duckdb_append_time(
duckdb_appender appender,
duckdb_time value
);
duckdb_state duckdb_append_timestamp(
duckdb_appender appender,
duckdb_timestamp value
);
duckdb_state duckdb_append_interval(
duckdb_appender appender,
duckdb_interval value
);
duckdb_state duckdb_append_varchar(
duckdb_appender appender,
const char *val
);
duckdb_state duckdb_append_varchar_length(
duckdb_appender appender,
const char *val,
idx_t length
);
duckdb_state duckdb_append_blob(
duckdb_appender appender,
const void *data,
idx_t length
);
duckdb_state duckdb_append_null(
duckdb_appender appender
);
duckdb_state duckdb_append_value(
duckdb_appender appender,
duckdb_value value
);
duckdb_state duckdb_append_data_chunk(
duckdb_appender appender,
duckdb_data_chunk chunk
);