ulib/3party/sqlpp11/docs/Dynamic-Insert.md
tqcq 99c258107b
All checks were successful
rpcrypto-build / build (Release, hisiv510.toolchain.cmake) (push) Successful in 1m24s
rpcrypto-build / build (Debug, himix200.toolchain.cmake) (push) Successful in 1m30s
rpcrypto-build / build (Debug, hisiv510.toolchain.cmake) (push) Successful in 1m43s
linux-mips64-gcc / linux-gcc-mips64el (push) Successful in 1m47s
linux-x64-gcc / linux-gcc (push) Successful in 2m11s
rpcrypto-build / build (Release, himix200.toolchain.cmake) (push) Successful in 3m19s
linux-hisiv500-gcc / linux-gcc-hisiv500 (push) Successful in 3m39s
feat/support_orm (#2)
Co-authored-by: tqcq <99722391+tqcq@users.noreply.github.com>
Reviewed-on: #2
2024-01-06 13:56:45 +00:00

1.8 KiB

Introduction

This page explains dynamic insert statements. Before studying this page, you should read about static insert statements.

If you know the exact structure of your inserts at compile time, statically constructed insert statements are perfect. But if the structure depends on runtime information like user input, you will need dynamic insert statements. For those only provide part fields of table schema, leave others to default value or NULL, dynamic insert statement is a must. Depending on your needs, you can choose the required dosage.

A Basic Example

So let us construct insert statement with a dynamic part

auto s = dynamic_insert_into(db, foo).dynamic_set(
    foo.name = name,
);
s.insert_list.add(foo.id = runtimeStatement.id);
s.insert_list.add(foo.hasFun = runtimeStatement.hasFun);
const int64_t result = db(s);

Admittedly, a rather simplistic example (please suggest nicer ones), but anyway, this is what's happening:

dynamic_insert_into(db, table) 

This initializes a dynamic insert. One major difference between dynamic_insert_into and insert_into is the first argument of dynamic_insert_into: a database connection. This is used to evaluate the dynamic parts of the statement as they are added.

.dynamic_set(...);
...
s.insert_list.add(foo.id = runtimeStatement.id);
s.insert_list.add(foo.hasFun = runtimeStatement.hasFun);

The first part creates a new insert object that accepts a dynamically constructed set expression. In this case the user can determine whether to search for a certain id or a certain hasFun, or neither or both.

const int64_t result = db(s);

Finally use db(s) to execute the insert statement, and returns a int64_t value. If foo.id column is a AUTO INCREMENT (auto generated) id field, this will returns the auto generated id, for others this will returns 0.