2013-08-14 03:49:34 +08:00
sqlpp11
=======
2013-08-15 15:30:57 +08:00
A type safe template library for SQL queries and results in C++
2013-08-14 04:43:10 +08:00
Motivation:
-----------
2013-08-15 15:30:57 +08:00
SQL and C++ are both strongly typed languages. Still, most C/C++ interfaces to SQL are based on constructing queries as strings and on interpreting arrays or maps of strings as results.
2013-08-14 04:43:10 +08:00
sqlpp11 is a templated library representing an embedded domain specific language (EDSL) that allows you to
2013-08-17 17:27:41 +08:00
* define types representing tables and columns,
* construct type safe queries checked at compile time for syntax errors, type errors, name errors and even some semantic errors,
* interpret results by iterating over query-specific structs with appropriately named and typed members.
2013-08-14 04:43:10 +08:00
2013-08-15 15:30:57 +08:00
This results in several benefits, e.g.
2013-08-17 17:27:41 +08:00
* the library user operates comfortably on structs and functions,
* the compiler reports many kinds of errors long before the code enters unit testing or production,
* the library hides the gory details of string construction for queries and interpreting string based results returned by select calls.
2013-08-14 04:43:10 +08:00
Examples:
---------
2013-08-15 15:30:57 +08:00
For the examples, lets assume you have a table class representing something like
2013-08-14 04:43:10 +08:00
```SQL
CREATE TABLE foo (
2013-08-15 15:48:57 +08:00
id bigint,
name varchar(50),
hasFun bool
2013-08-14 04:43:10 +08:00
);
```
And we assume to have a database connection object:
```C++
TabFoo foo;
Db db(/* some arguments*/);
// selecting zero or more results, iterating over the results
for (const auto& row: db.run(select(foo.name, foo.hasFun).from(foo).where(foo.id > 17 and foo.name.like("%bar%"))))
{
2013-08-15 15:48:57 +08:00
if (row.name.is_null())
std::cerr < < "name is null, will convert to empty string" < < std::endl ;
std::string name = row.name; // string-like fields are implicitly convertible to string
bool hasFun = hasFun; // bool fields are implicitly convertible to bool
2013-08-14 04:43:10 +08:00
}
// selecting ALL columns of a table
2013-08-15 15:48:57 +08:00
for (const auto& row: db.run(select(all_of(foo)).from(foo).where(foo.hasFun or foo.name == "joker")))
2013-08-14 04:43:10 +08:00
{
2013-08-15 15:48:57 +08:00
int64_t id = row.id; // numeric fields are implicitly convertible to numeric c++ types
2013-08-14 04:43:10 +08:00
}
// selecting zero or one row, showing off with an alias:
SQLPP_ALIAS_PROVIDER_GENERATOR(cheese);
if (const auto& row = db.run(select(foo.name.as(cheese)).from(foo).where(foo.id == 17)))
{
2013-08-15 15:48:57 +08:00
std::cerr < < "found: " < < row.cheese < < std::endl ;
2013-08-14 04:43:10 +08:00
}
// selecting exactly one row:
return db.run(select(count(foo.id)).from(foo))->count;
Of course there are joins and subqueries, more functions, order_by, group_by etc.
These will be documented soon.
// A sample insert
db.run(insert_into(foo).set(foo.id = 17, foo.name = "bar", foo.hasFun = true));
// A sample update
2013-08-15 15:30:57 +08:00
db.run(update(foo).set(foo.hasFun = not foo.hasFun).where(foo.name != "nobody"));
2013-08-14 04:43:10 +08:00
// A sample delete
2013-08-15 15:48:57 +08:00
db.run(remove_from(foo).where(not foo.hasFun));
2013-08-14 04:43:10 +08:00
```
Requirements:
-------------
2013-08-15 17:54:20 +08:00
__Compiler:__
sqlpp11 makes heavy use of C++11 and requires a recent compiler and STL. The following compilers are known to compile the test programs:
2013-08-14 04:43:10 +08:00
2013-08-19 14:10:11 +08:00
* clang-3.2 on Ubuntu-12.4
* g++-4.8 on Ubuntu-12.4
2013-08-14 04:43:10 +08:00
2013-08-15 17:54:20 +08:00
__Database Connector:__
sqlpp11 requires a certain api in order to connect with the database, see database/api.h.
2013-08-14 04:43:10 +08:00
Links to sample implementations will follow soon.