Appenders 是从 C 接口中将数据加载到 DuckDB 的最有效方式,推荐用于快速数据加载。Appender 比使用预处理语句或单独的 INSERT INTO
语句要快得多。
追加操作以行格式进行。对于每一列,应调用duckdb_append_[type]
,然后通过调用duckdb_appender_end_row
来完成该行。在所有行都追加完毕后,应使用duckdb_appender_destroy
来最终化追加器并清理生成的内存。
请注意,即使函数返回DuckDBError
,也应始终在结果追加器上调用duckdb_appender_destroy
。
Example
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 参考概览
duckdb_state duckdb_appender_create(duckdb_connection connection, 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_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_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_data_chunk(duckdb_appender appender, duckdb_data_chunk chunk);
duckdb_appender_create
创建一个附加器对象。
请注意,必须使用duckdb_appender_destroy
销毁对象。
语法
duckdb_state duckdb_appender_create(
duckdb_connection connection,
const char *schema,
const char *table,
duckdb_appender *out_appender
);
参数
connection
: 创建appender的连接上下文。schema
: 要追加到的表的模式,或使用nullptr
表示默认模式。table
: 要追加到的表名。out_appender
: 生成的附加器对象。
返回值
DuckDBSuccess
成功时或 DuckDBError
失败时。
duckdb_appender_column_count
返回属于追加器的表中的列数。
Syntax
idx_t duckdb_appender_column_count(
duckdb_appender appender
);
Parameters
appender
: 获取列数的appender。
返回值
表中的列数。
duckdb_appender_column_type
返回指定索引处列的类型。
注意:结果类型应使用duckdb_destroy_logical_type
销毁。
Syntax
duckdb_logical_type duckdb_appender_column_type(
duckdb_appender appender,
idx_t col_idx
);
Parameters
appender
: 从中获取列类型的appender。col_idx
: 要获取类型的列的索引。
Return Value
列的duckdb_logical_type。
duckdb_appender_error
返回与给定appender关联的错误消息。
如果appender没有错误消息,则返回nullptr
。
错误信息不应被释放。当调用duckdb_appender_destroy
时,它将被自动释放。
Syntax
const char *duckdb_appender_error(
duckdb_appender appender
);
Parameters
appender
: 获取错误的appender。
Return Value
错误信息,如果没有则为 nullptr
。
duckdb_appender_flush
将appender刷新到表中,强制清除appender的缓存。如果刷新数据时触发约束违规或任何其他错误,则所有数据都将失效,并且此函数返回DuckDBError。无法再追加更多值。调用duckdb_appender_error以获取错误消息,然后调用duckdb_appender_destroy以销毁失效的appender。
Syntax
duckdb_state duckdb_appender_flush(
duckdb_appender appender
);
Parameters
appender
: 要刷新的appender。
Return Value
DuckDBSuccess
on success or DuckDBError
on failure.
duckdb_appender_close
通过刷新所有中间状态并关闭它以进行进一步的追加来关闭appender。如果刷新数据触发约束违规或任何其他错误,则所有数据都将失效,并且此函数返回DuckDBError。调用duckdb_appender_error以获取错误消息,然后调用duckdb_appender_destroy以销毁失效的appender。
Syntax
duckdb_state duckdb_appender_close(
duckdb_appender appender
);
Parameters
appender
: 要刷新和关闭的appender。
Return Value
DuckDBSuccess
on success or DuckDBError
on failure.
duckdb_appender_destroy
通过将所有中间状态刷新到表并销毁它来关闭appender。通过销毁它,此函数释放与appender相关的所有内存。如果刷新数据触发约束违规,则所有数据都将失效,并且此函数返回DuckDBError。由于appender的销毁,不再可能通过duckdb_appender_error获取特定的错误消息。因此,如果您需要了解特定错误的详细信息,请在销毁appender之前调用duckdb_appender_close。
Syntax
duckdb_state duckdb_appender_destroy(
duckdb_appender *appender
);
Parameters
appender
: 要刷新、关闭和销毁的appender。
Return Value
DuckDBSuccess
on success or DuckDBError
on failure.
duckdb_appender_begin_row
一个nop函数,为了向后兼容性而提供。不执行任何操作。只有duckdb_appender_end_row
是必需的。
Syntax
duckdb_state duckdb_appender_begin_row(
duckdb_appender appender
);
duckdb_appender_end_row
完成当前行的追加。调用end_row后,可以追加下一行。
Syntax
duckdb_state duckdb_appender_end_row(
duckdb_appender appender
);
Parameters
appender
: 附加器。
Return Value
DuckDBSuccess
on success or DuckDBError
on failure.
duckdb_append_default
向appender追加一个DEFAULT值(如果列不可用DEFAULT,则为NULL)。
Syntax
duckdb_state duckdb_append_default(
duckdb_appender appender
);
duckdb_append_bool
向appender追加一个布尔值。
Syntax
duckdb_state duckdb_append_bool(
duckdb_appender appender,
bool value
);
duckdb_append_int8
将一个int8_t值附加到appender。
Syntax
duckdb_state duckdb_append_int8(
duckdb_appender appender,
int8_t value
);
duckdb_append_int16
向appender追加一个int16_t值。
Syntax
duckdb_state duckdb_append_int16(
duckdb_appender appender,
int16_t value
);
duckdb_append_int32
向appender追加一个int32_t值。
Syntax
duckdb_state duckdb_append_int32(
duckdb_appender appender,
int32_t value
);
duckdb_append_int64
将一个int64_t值附加到appender。
Syntax
duckdb_state duckdb_append_int64(
duckdb_appender appender,
int64_t value
);
duckdb_append_hugeint
向appender添加一个duckdb_hugeint值。
Syntax
duckdb_state duckdb_append_hugeint(
duckdb_appender appender,
duckdb_hugeint value
);
duckdb_append_uint8
将一个uint8_t值附加到appender。
Syntax
duckdb_state duckdb_append_uint8(
duckdb_appender appender,
uint8_t value
);
duckdb_append_uint16
将一个uint16_t值附加到appender。
Syntax
duckdb_state duckdb_append_uint16(
duckdb_appender appender,
uint16_t value
);
duckdb_append_uint32
向appender追加一个uint32_t值。
Syntax
duckdb_state duckdb_append_uint32(
duckdb_appender appender,
uint32_t value
);
duckdb_append_uint64
将一个uint64_t值附加到appender。
Syntax
duckdb_state duckdb_append_uint64(
duckdb_appender appender,
uint64_t value
);
duckdb_append_uhugeint
向appender追加一个duckdb_uhugeint值。
Syntax
duckdb_state duckdb_append_uhugeint(
duckdb_appender appender,
duckdb_uhugeint value
);
duckdb_append_float
向追加器追加一个浮点值。
Syntax
duckdb_state duckdb_append_float(
duckdb_appender appender,
float value
);
duckdb_append_double
向appender追加一个双精度值。
Syntax
duckdb_state duckdb_append_double(
duckdb_appender appender,
double value
);
duckdb_append_date
向appender追加一个duckdb_date值。
Syntax
duckdb_state duckdb_append_date(
duckdb_appender appender,
duckdb_date value
);
duckdb_append_time
向appender追加一个duckdb_time值。
Syntax
duckdb_state duckdb_append_time(
duckdb_appender appender,
duckdb_time value
);
duckdb_append_timestamp
向appender追加一个duckdb_timestamp值。
Syntax
duckdb_state duckdb_append_timestamp(
duckdb_appender appender,
duckdb_timestamp value
);
duckdb_append_interval
向appender添加一个duckdb_interval值。
Syntax
duckdb_state duckdb_append_interval(
duckdb_appender appender,
duckdb_interval value
);
duckdb_append_varchar
将一个varchar值附加到appender。
Syntax
duckdb_state duckdb_append_varchar(
duckdb_appender appender,
const char *val
);
duckdb_append_varchar_length
将一个varchar值附加到appender。
Syntax
duckdb_state duckdb_append_varchar_length(
duckdb_appender appender,
const char *val,
idx_t length
);
duckdb_append_blob
向追加器追加一个blob值。
Syntax
duckdb_state duckdb_append_blob(
duckdb_appender appender,
const void *data,
idx_t length
);
duckdb_append_null
向appender追加一个NULL值(任何类型)。
Syntax
duckdb_state duckdb_append_null(
duckdb_appender appender
);
duckdb_append_data_chunk
将预填充的数据块附加到指定的附加器。
数据块的类型必须与表的类型完全匹配,不执行类型转换。 如果类型不匹配或appender处于无效状态,则返回DuckDBError。 如果追加成功,则返回DuckDBSuccess。
Syntax
duckdb_state duckdb_append_data_chunk(
duckdb_appender appender,
duckdb_data_chunk chunk
);
Parameters
appender
: 要附加到的附加器。chunk
: 要追加的数据块。
Return Value
返回状态。