0
0
mirror of https://github.com/rbock/sqlpp11.git synced 2024-11-15 20:31:16 +08:00
A type safe SQL template library for C++
Go to file
rbock e629086e72 Merge tag '0.36' into develop
Several breaking changes:

  * `from(a,b)` not allowed anymore, please use explicit joins
  * `where(true)` not allowed anymore, please use `.unconditionally()` or sqlpp::value(true)
  * `some_sql_expression and true` not allowed anymore, please use `tab.col == sqlpp::value(true)` if you really want to express this.
  * `having(expression)` requires `expression` to be made of aggregates, e.g. columns named in `group_by()` or aggregate functions like `count()` or constant values.
  * `where()` and `having()` accept only one parameter

Several more clauses are now available as free functions.

Lots of additional tests.
2016-04-17 16:11:28 +02:00
cmake Added cmake package config file 2016-01-09 19:00:05 +01:00
connector_api Reformatted using clang-format 2015-09-13 21:33:19 +02:00
examples Merge branch 'release/0.35' 2015-12-29 11:03:17 +01:00
include/sqlpp11 Removed two obsolete files 2016-04-17 13:28:16 +02:00
scripts fix my mistake 2016-03-26 14:51:25 +03:00
test_constraints Prevent unconditional joins, and naked bool in where() or boolean expressions 2016-03-20 09:13:49 +01:00
test_serializer Added more tests and fixed dynamic free clauses 2016-04-16 09:51:13 +02:00
test_static_asserts Added missing file (with some more tests) 2016-04-09 21:53:39 +02:00
test_types Removed obsolete file 2016-03-20 09:13:49 +01:00
tests MSVC update 2 already has std::chrono::floor 2016-04-17 10:45:31 +02:00
.appveyor.yml MSVC update 2 already has std::chrono::floor 2016-04-17 10:45:31 +02:00
.clang-format Reformatted using clang-format 2015-09-13 21:33:19 +02:00
.travis.yml Checkout a specific version of date for CI 2016-04-14 16:41:17 +02:00
ChangeLog.md Create ChangeLog.md 2016-04-08 21:21:28 +02:00
CMakeLists.txt Merge branch 'develop' of https://github.com/ianda/sqlpp11 into ianda-develop 2016-04-17 13:52:50 +02:00
coveralls add coveralls coverage reporting 2015-05-30 00:56:33 +02:00
CREDITS shamelessly adding myself to CREDITS 2015-05-30 01:12:31 +02:00
LICENSE Update LICENSE 2016-03-05 20:14:35 +01:00
pre-commit Reformatted using clang-format 2015-09-13 21:33:19 +02:00
README.md Merge branch 'release/0.36' 2016-04-17 16:05:10 +02:00

sqlpp11

A type safe embedded domain specific language for SQL queries and results in C++

Documentation is found in the wiki

Breaking changes in 0.36:

See Changes

Status:

Branch / Compiler clang-3.4, gcc-4.9, Xcode-7 MSVC 2015 Test Coverage
master Build Status Build status Coverage Status
develop Build Status Build status Coverage Status

Motivation:

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.

sqlpp11 is a templated library representing an embedded domain specific language (EDSL) that allows you to

  • 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.

This results in several benefits, e.g.

  • 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 results returned by select calls.

The library supports both static and dynamic queries. The former offers greater benefit in terms of type and consistency checking. The latter makes it easier to construct queries on the flight.

sqlpp11 is vendor-neutral. Specific traits of databases (e.g. unsupported or non-standard features) are handled by connector libraries. Connector libraries can inform the developer of missing features at compile time. They also interpret expressions specifically where needed. For example, the connector could use the operator|| or the concat method for string concatenation without the developer being required to change the statement.

The library is already used in production but it is certainly not complete yet. Feature requests, bug reports, contributions to code or documentation are most welcome.

Examples:

For the examples, lets assume you have a table class representing something like

CREATE TABLE foo (
    id bigint,
    name varchar(50),
    hasFun bool
);

And we assume to have a database connection object:

TabFoo foo;
Db db(/* some arguments*/);

// selecting zero or more results, iterating over the results
for (const auto& row : db(select(foo.name, foo.hasFun).from(foo).where(foo.id > 17 and foo.name.like("%bar%"))))
{
    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 = row.hasFun;          // bool fields are implicitly convertible to bool
}

// selecting ALL columns of a table
for (const auto& row : db(select(all_of(foo)).from(foo).where(foo.hasFun or foo.name == "joker")))
{
    int64_t id = row.id; // numeric fields are implicitly convertible to numeric c++ types
}

// selecting zero or one row, showing off with an alias:
SQLPP_ALIAS_PROVIDER(cheese);
if (const auto& row = db(select(foo.name.as(cheese)).from(foo).where(foo.id == 17)))
{
    std::cerr << "found: " << row.cheese << std::endl;
}

// selecting a single row with a single result:
return db(select(count(foo.id)).from(foo).where(true)).front().count;

Of course there are joins and subqueries, more functions, order_by, group_by etc.
These will be documented soon.

// A sample insert
db(insert_into(foo).set(foo.id = 17, foo.name = "bar", foo.hasFun = true));

// A sample update
db(update(foo).set(foo.hasFun = not foo.hasFun).where(foo.name != "nobody"));

// A sample delete
db(remove_from(foo).where(not foo.hasFun));

Additional information available:

Past talks about sqlpp11 and some coding concepts used within the library:

You can contact me

Requirements:

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:

  • clang-3.4+ on Ubuntu-12.4
  • g++-4.8+ on Ubuntu-12.4
  • g++-4.8+ on cygwin 64bit
  • g++-4.9+ on Debian Unstable
  • Xcode-7 on OS X
  • MSVC 2015 Update 1 on Windows Server 2012

Database Connector: sqlpp11 requires a certain api in order to connect with the database, see database/api.h.

To demonstrate that sqlpp11 can work with other backends as well, here is an experimental backend for structs in standard containers:

Date Library: sqlpp11 requires Howard Hinnant's date library for date and date_time data types.

Basic usage:

Linux install: git clone date library, needed connectors, cmake and make install them.

Create DDL files:

mysql: 'show create table MyDatabase.MyTable' #or
mysqldump --no-data MyDatabase > MyDatabase.sql

Create headers for them with provided python script:

%sqlpp11_dir%/scripts/ddl2cpp ~/temp/MyTable.ddl  ~/temp/MyTable %DatabaseNamespaceForExample%

(In case you're getting notes about unsupported column type take a look at the other datatypes in sqlpp11/data_types. They are not hard to implement.)

Include generated header (MyTable.h), that's all

License:

sqlpp11 is distributed under the BSD 2-Clause License.