class DuckDB::Appender
appender.append_row(1, ‘Alice’)
appender = con.appender(‘users’)
con.query(‘CREATE TABLE users (id INTEGER, name VARCHAR)’)
con = db.connect
db = DuckDB::Database.open
require ‘duckdb’
The DuckDB::Appender encapsulates DuckDB Appender.
def append(value)
appender.append('Alice')
appender.append(1)
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, name VARCHAR)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
appends value.
def append(value) case value when NilClass append_null when Float append_double(value) when Integer case value when RANGE_INT16 append_int16(value) when RANGE_INT32 append_int32(value) when RANGE_INT64 append_int64(value) else append_hugeint(value) end when String blob?(value) ? append_blob(value) : append_varchar(value) when TrueClass, FalseClass append_bool(value) when Time append_timestamp(value) when Date append_date(value) when DuckDB::Interval append_interval(value) else raise(DuckDB::Error, "not supported type #{value} (#{value.class})") end end
def append_blob(value)
.end_row
.append('\0\1\2\3\4\5'.encode(Encoding::BINARY))
appender
appender = con.appender('values')
con.query('CREATE TABLE values (value BLOB)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a varchar value to the current row in the appender.
appender.append_blob(val) -> self
call-seq:
def append_blob(value) return self if _append_blob(value) raise_appender_error('failed to append_blob') end
def append_bool(value)
.end_row
.append_bool(true)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, active BOOLEAN)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a boolean value to the current row in the appender.
appender.append_bool(val) -> self
call-seq:
def append_bool(value) return self if _append_bool(value) raise_appender_error('failed to append_bool') end
def append_date(value)
appender.end_row
# appender.append_date('2021-10-10')
# appender.append_date(Time.now)
# or
appender.append_date(Date.today)
appender = con.appender('dates')
con.query('CREATE TABLE dates (date_value DATE)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a date value to the current row in the appender.
appender.append_date(val) -> self
call-seq:
def append_date(value) date = _parse_date(value) return self if _append_date(date.year, date.month, date.day) raise_appender_error('failed to append_date') end
def append_default
.end_row
.append_default
appender
appender = con.appender('values')
con.query('CREATE TABLE values (value INTEGER DEFAULT 1)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
appends a NULL value.
If the column does not have a default value, this method
Appends a default value to the current row in the appender.
appender.append_default -> self
call-seq:
def append_default return self if _append_default raise_appender_error('failed to append_default') end
def append_double(value)
.end_row
.append_double(1.23)
appender
appender = con.appender('numbers')
con.query('CREATE TABLE numbers (num DOUBLE)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a double value to the current row in the appender.
appender.append_double(val) -> self
call-seq:
def append_double(value) return self if _append_double(value) raise_appender_error('failed to append_double') end
def append_float(value)
.end_row
.append_float(1.23)
appender
appender = con.appender('numbers')
con.query('CREATE TABLE numbers (num FLOAT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a float value to the current row in the appender.
appender.append_float(val) -> self
call-seq:
def append_float(value) return self if _append_float(value) raise_appender_error('failed to append_float') end
def append_hugeint(value)
.end_row
.append_hugeint(-170_141_183_460_469_231_731_687_303_715_884_105_727)
appender
appender = con.appender('numbers')
con.query('CREATE TABLE numbers (num HUGEINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a huge int value to the current row in the appender.
appender.append_hugeint(val) -> self
call-seq:
def append_hugeint(value) lower, upper = integer_to_hugeint(value) return self if _append_hugeint(lower, upper) raise_appender_error('failed to append_hugeint') end
def append_int16(value)
.end_row
.append_int16(20)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age SMALLINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an int16(SMALLINT) value to the current row in the appender.
appender.append_int16(val) -> self
call-seq:
def append_int16(value) return self if _append_int16(value) raise_appender_error('failed to append_int16') end
def append_int32(value)
.end_row
.append_int32(20)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age INTEGER)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an int32(INTEGER) value to the current row in the appender.
appender.append_int32(val) -> self
call-seq:
def append_int32(value) return self if _append_int32(value) raise_appender_error('failed to append_int32') end
def append_int64(value)
.end_row
.append_int64(20)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age BIGINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an int64(BIGINT) value to the current row in the appender.
appender.append_int64(val) -> self
call-seq:
def append_int64(value) return self if _append_int64(value) raise_appender_error('failed to append_int64') end
def append_int8(value)
.flush
.end_row
.append_int8(20)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age TINYINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an int8(TINYINT) value to the current row in the appender.
appender.append_int8(val) -> self
call-seq:
def append_int8(value) return self if _append_int8(value) raise_appender_error('failed to append_int8') end
def append_interval(value)
.end_row
.append_interval('P1Y2D') # => append 1 year 2 days interval.
appender
appender = con.appender('intervals')
con.query('CREATE TABLE intervals (interval_value INTERVAL)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
The argument must be ISO8601 duration format.
Appends an interval value to the current row in the appender.
appender.append_interval(val) -> self
call-seq:
def append_interval(value) value = Interval.to_interval(value) return self if _append_interval(value.interval_months, value.interval_days, value.interval_micros) raise_appender_error('failed to append_interval') end
def append_null
.end_row
.append_null
appender
appender = con.appender('values')
con.query('CREATE TABLE values (value INTEGER)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a NULL value to the current row in the appender.
appender.append_null -> self
call-seq:
def append_null return self if _append_null raise_appender_error('failed to append_null') end
def append_row(*args)
appender.append('Alice')
appender.append(2)
is same as:
appender.append_row(1, 'Alice')
append a row.
def append_row(*args) args.each do |arg| append(arg) end end_row end
def append_time(value)
appender.end_row
# appender.append_time('01:01:01')
# or
appender.append_time(Time.now)
appender = con.appender('times')
con.query('CREATE TABLE times (time_value TIME)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a time value to the current row in the appender.
appender.append_time(val) -> self
call-seq:
def append_time(value) time = _parse_time(value) return self if _append_time(time.hour, time.min, time.sec, time.usec) raise_appender_error('failed to append_time') end
def append_timestamp(value)
appender.end_row
# appender.append_time('2021-08-01 01:01:01')
# appender.append_time(Date.today)
# or
appender.append_time(Time.now)
appender = con.appender('timestamps')
con.query('CREATE TABLE timestamps (timestamp_value TIMESTAMP)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a timestamp value to the current row in the appender.
appender.append_timestamp(val) -> self
call-seq:
def append_timestamp(value) time = to_time(value) return self if _append_timestamp(time.year, time.month, time.day, time.hour, time.min, time.sec, time.nsec / 1000) raise_appender_error('failed to append_timestamp') end
def append_uhugeint(value)
.end_row
.append_hugeint(340_282_366_920_938_463_463_374_607_431_768_211_455)
appender
appender = con.appender('numbers')
con.query('CREATE TABLE numbers (num UHUGEINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an unsigned huge int value to the current row in the appender.
appender.append_uhugeint(val) -> self
call-seq:
def append_uhugeint(value) lower, upper = integer_to_hugeint(value) return self if _append_uhugeint(lower, upper) raise_appender_error('failed to append_uhugeint') end
def append_uint16(value)
.end_row
.append_uint16(20)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age USMALLINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an uint16 value to the current row in the appender.
appender.append_uint16(val) -> self
call-seq:
def append_uint16(value) return self if _append_uint16(value) raise_appender_error('failed to append_uint16') end
def append_uint32(value)
.end_row
.append_uint32(20)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age UINTEGER)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an uint32 value to the current row in the appender.
appender.append_uint32(val) -> self
call-seq:
def append_uint32(value) return self if _append_uint32(value) raise_appender_error('failed to append_uint32') end
def append_uint64(value)
.end_row
.append_uint64(20)
.append_int32(1)
Appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age UBIGINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an uint64 value to the current row in the appender.
appender.append_uint64(val) -> self
call-seq:
def append_uint64(value) return self if _append_uint64(value) raise_appender_error('failed to append_uint64') end
def append_uint8(value)
.end_row
.append_uint8(20)
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, age UTINYINT)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends an uint8 value to the current row in the appender.
appender.append_uint8(val) -> self
call-seq:
def append_uint8(value) return self if _append_uint8(value) raise_appender_error('failed to append_uint8') end
def append_varchar(value)
.end_row
.append_varchar('Alice')
appender
appender = con.appender('names')
con.query('CREATE TABLE names (name VARCHAR)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a varchar value to the current row in the appender.
appender.append_varchar(val) -> self
call-seq:
def append_varchar(value) return self if _append_varchar(value) raise_appender_error('failed to append_varchar') end
def append_varchar_length(value, length)
.end_row
.append_varchar_length('Alice', 5)
appender
appender = con.appender('names')
con.query('CREATE TABLE names (name VARCHAR)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Appends a varchar value to the current row in the appender.
appender.append_varchar_length(val, len) -> self
call-seq:
def append_varchar_length(value, length) return self if _append_varchar_length(value, length) raise_appender_error('failed to append_varchar_length') end
def begin_row
A nop method, provided for backwards compatibility reasons.
appender.begin_row -> self
:call-seq:
def begin_row self end
def blob?(value) # :nodoc:
def blob?(value) # :nodoc: value.instance_of?(DuckDB::Blob) || value.encoding == Encoding::BINARY end
def close
.end_row
.append_varchar('Alice')
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, name VARCHAR)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
invalidated, and this method raises DuckDB::Error.
If flushing the data triggers a constraint violation or any other error, then all data is
Closes the appender by flushing all intermediate states and closing it for further appends.
appender.close -> self
:call-seq:
def close return self if _close raise_appender_error('failed to close') end
def end_row
.append_varchar('Alice')
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, name VARCHAR)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
Finish the current row of appends. After end_row is called, the next row can be appended.
appender.end_row -> self
call-seq:
def end_row return self if _end_row raise_appender_error('failed to end_row') end
def flush
.end_row
.append_varchar('Alice')
.append_int32(1)
appender
appender = con.appender('users')
con.query('CREATE TABLE users (id INTEGER, name VARCHAR)')
con = db.connect
db = DuckDB::Database.open
require 'duckdb'
data is invalidated, and this method raises DuckDB::Error.
If flushing the data triggers a constraint violation or any other error, then all
Flushes the appender to the table, forcing the cache of the appender to be cleared.
appender.flush -> self
:call-seq:
def flush return self if _flush raise_appender_error('failed to flush') end
def raise_appender_error(default_message) # :nodoc:
def raise_appender_error(default_message) # :nodoc: message = error_message raise DuckDB::Error, message || default_message end
def to_time(value) # :nodoc:
def to_time(value) # :nodoc: case value when Date value.to_time else _parse_time(value) end end