2013-08-13 12:49:34 -07:00
sqlpp11
=======
2014-01-29 13:10:45 +01:00
A type safe embedded domain specific language for SQL queries and results in C++
2013-08-13 22:43:10 +02:00
2016-04-08 21:40:01 +02:00
Documentation is found in the [wiki ](https://github.com/rbock/sqlpp11/wiki )
2015-12-29 10:26:46 +01:00
2017-09-17 09:03:45 +02:00
So what is this about?
----------------------
2013-08-15 09:30:57 +02: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-13 22:43:10 +02:00
sqlpp11 is a templated library representing an embedded domain specific language (EDSL) that allows you to
2013-08-17 11:27:41 +02: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-13 22:43:10 +02:00
2013-08-15 09:30:57 +02:00
This results in several benefits, e.g.
2013-08-17 11:27:41 +02: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,
2014-08-18 00:07:21 +02:00
* the library hides the gory details of string construction for queries and interpreting results returned by select calls.
2013-08-13 22:43:10 +02:00
2013-09-27 10:57:32 +02:00
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.
2015-04-26 10:13:40 +02:00
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.
2013-09-27 10:57:32 +02:00
2016-04-08 21:40:01 +02:00
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.
2013-08-13 22:43:10 +02:00
Examples:
---------
2015-12-23 20:27:55 +01:00
For the examples, lets assume you have a table class representing something like
2013-08-13 22:43:10 +02:00
```SQL
CREATE TABLE foo (
2013-08-15 09:48:57 +02:00
id bigint,
name varchar(50),
hasFun bool
2013-08-13 22:43:10 +02: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
2014-07-03 10:15:52 +02:00
for (const auto& row : db(select(foo.name, foo.hasFun).from(foo).where(foo.id > 17 and foo.name.like("%bar%"))))
2013-08-13 22:43:10 +02:00
{
2013-08-15 09:48:57 +02: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
2013-10-02 07:34:37 +02:00
bool hasFun = row.hasFun; // bool fields are implicitly convertible to bool
2013-08-13 22:43:10 +02:00
}
// selecting ALL columns of a table
2014-07-03 10:15:52 +02:00
for (const auto& row : db(select(all_of(foo)).from(foo).where(foo.hasFun or foo.name == "joker")))
2013-08-13 22:43:10 +02:00
{
2013-08-15 09:48:57 +02:00
int64_t id = row.id; // numeric fields are implicitly convertible to numeric c++ types
2013-08-13 22:43:10 +02:00
}
// selecting zero or one row, showing off with an alias:
2014-01-29 13:10:45 +01:00
SQLPP_ALIAS_PROVIDER(cheese);
2014-07-03 10:15:52 +02:00
if (const auto& row = db(select(foo.name.as(cheese)).from(foo).where(foo.id == 17)))
2013-08-13 22:43:10 +02:00
{
2013-08-15 09:48:57 +02:00
std::cerr < < "found: " < < row.cheese < < std::endl ;
2013-08-13 22:43:10 +02:00
}
2013-10-01 07:05:12 +02:00
// selecting a single row with a single result:
2016-09-30 09:57:42 +08:00
return db(select(count(foo.id)).from(foo).unconditionally()).front().count;
2013-08-13 22:43:10 +02:00
Of course there are joins and subqueries, more functions, order_by, group_by etc.
These will be documented soon.
// A sample insert
2014-07-03 10:15:52 +02:00
db(insert_into(foo).set(foo.id = 17, foo.name = "bar", foo.hasFun = true));
2013-08-13 22:43:10 +02:00
// A sample update
2014-07-03 10:15:52 +02:00
db(update(foo).set(foo.hasFun = not foo.hasFun).where(foo.name != "nobody"));
2013-08-13 22:43:10 +02:00
// A sample delete
2014-07-03 10:15:52 +02:00
db(remove_from(foo).where(not foo.hasFun));
2013-08-13 22:43:10 +02:00
```
2017-09-17 09:03:45 +02:00
License:
-------------
sqlpp11 is distributed under the [BSD 2-Clause License ](https://github.com/rbock/sqlpp11/blob/master/LICENSE ).
Status:
-------
Branch / Compiler | clang-3.4, gcc-4.9, Xcode-7 | MSVC 2015/2017 | Test Coverage
------------------| -------------------------------|-------------|---------------
master | [![Build Status ](https://travis-ci.org/rbock/sqlpp11.svg?branch=master )](https://travis-ci.org/rbock/sqlpp11?branch=master) | [![Build status ](https://ci.appveyor.com/api/projects/status/eid7mwqgavo0h61h/branch/master?svg=true )](https://ci.appveyor.com/project/rbock/sqlpp11/branch/master) | [![Coverage Status ](https://coveralls.io/repos/rbock/sqlpp11/badge.svg?branch=master )](https://coveralls.io/r/rbock/sqlpp11?branch=master)
develop | [![Build Status ](https://travis-ci.org/rbock/sqlpp11.svg?branch=develop )](https://travis-ci.org/rbock/sqlpp11?branch=develop) | [![Build status ](https://ci.appveyor.com/api/projects/status/eid7mwqgavo0h61h/branch/develop?svg=true )](https://ci.appveyor.com/project/rbock/sqlpp11/branch/develop) | [![Coverage Status ](https://coveralls.io/repos/rbock/sqlpp11/badge.svg?branch=develop )](https://coveralls.io/r/rbock/sqlpp11?branch=develop)
2016-04-08 21:40:01 +02:00
Additional information available:
---------------------------------
Past talks about sqlpp11 and some coding concepts used within the library:
* [CppCast: ](http://cppcast.com )
* 2015-05-07: http://cppcast.com/2015/05/roland-bock/
* [CppCon: ](http://cppcon.org )
* 2015-09-24: [Pruning Error Messages From Your C++ Template Code ](https://www.youtube.com/watch?v=2ISqFW9fRws ), with examples from sqlpp11
* 2014-09-11: [sqlpp11, An SQL Library Worthy Of Modern C++ ](https://www.youtube.com/watch?v=cJPAjhBm-HQ )
* [Meeting C++: ](http://meetingcpp.com )
* 2014-12-05: [sqlpp11, An EDSL For Type-Safe SQL In C++11 ](https://www.youtube.com/watch?v=9Hjfg9IfzhU )
* [MUC++: ](http://www.meetup.com/MUCplusplus/ )
* 2014-02-27: [Selected C++11 Template Toffees From sqlpp11, Part1 ](https://www.youtube.com/watch?v=hXnGFYNbmXg ), [Part2 ](https://www.youtube.com/watch?v=WPCV6dvxZ_U ), [Part 3 ](https://www.youtube.com/watch?v=eB7hd_KjTig ), [Part 4 ](https://www.youtube.com/watch?v=NBfqzcN0_EQ )
2016-09-03 13:12:44 +02:00
2015-04-26 10:13:40 +02:00
2013-08-13 22:43:10 +02:00
Requirements:
-------------
2013-08-15 11:54:20 +02: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-13 22:43:10 +02:00
2015-12-29 10:26:46 +01:00
* 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
2013-08-13 22:43:10 +02:00
2013-08-15 11:54:20 +02:00
__Database Connector:__
sqlpp11 requires a certain api in order to connect with the database, see database/api.h.
2013-08-13 22:43:10 +02:00
2013-09-05 23:57:54 +02:00
* MySQL: https://github.com/rbock/sqlpp11-connector-mysql
2013-09-13 10:37:21 +02:00
* Sqlite3: https://github.com/rbock/sqlpp11-connector-sqlite3
2014-07-03 10:15:52 +02:00
* PostgreSQL: https://github.com/matthijs/sqlpp11-connector-postgresql
2016-04-24 17:36:36 +02:00
* ODBC: https://github.com/Erroneous1/sqlpp11-connector-odbc (experimental)
2015-12-23 20:27:55 +01:00
2016-03-19 21:20:05 +03:00
To demonstrate that sqlpp11 can work with other backends as well, here is an experimental backend for structs in standard containers:
* STL Container: https://github.com/rbock/sqlpp11-connector-stl
2015-12-29 10:26:46 +01:00
__Date Library:__
2016-10-21 15:40:40 +02:00
sqlpp11 requires [Howard Hinnant's date library ](https://github.com/HowardHinnant/date ) for `date` and `date_time` data types. Sqlpp11 includes CMake search module for this, but if you didn't install this library system-wide, you need to point cmake to it:
2016-06-09 21:15:41 +03:00
```
2016-10-21 15:40:40 +02:00
cmake -DHinnantDate_ROOT_DIR=/%PATH_TO_HinnantDate_SOURCE%/
2016-06-09 21:15:41 +03:00
```
2015-12-29 10:26:46 +01:00
2016-10-21 15:40:40 +02:00
Build and Install
-----------------
__Build from Source:__
Download and unpack the latest release from https://github.com/rbock/sqlpp11/releases or clone the repository. Inside the directory run the following commands:
```bash
mkdir build
cd build
cmake ..
make
make install
```
The last step will install the library system wide.
__Install via Homebrew (MacOS):__
```bash
brew install marvin182/zapfhahn/sqlpp11
```
Some connectors can be installed with the formula. See `brew info marvin182/zapfhahn/sqlpp11` for available options.
2020-02-12 01:03:17 -08:00
__Build via vcpkg:__
You can download and install sqlpp11 using the [vcpkg ](https://github.com/Microsoft/vcpkg ) dependency manager:
2020-02-13 23:16:26 +08:00
```bash
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install sqlpp11
```
2020-02-12 01:03:17 -08:00
The sqlpp11 port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request ](https://github.com/Microsoft/vcpkg ) on the vcpkg repository.
2016-10-21 15:40:40 +02:00
2020-02-13 23:16:26 +08:00
The following connector libraries for sqlpp11 are maintained as a separate package in vcpkg:
* [sqlpp11-connector-sqlite3 ](https://github.com/microsoft/vcpkg/tree/master/ports/sqlpp11-connector-sqlite3 )
* [sqlpp11-connector-mysql ](https://github.com/microsoft/vcpkg/tree/master/ports/sqlpp11-connector-mysql )
2016-03-19 21:19:15 +03:00
Basic usage:
-------------
2016-03-21 21:38:37 +03:00
__Create DDL files__:
```
2016-03-21 22:02:41 +03:00
mysql: 'show create table MyDatabase.MyTable' #or
mysqldump --no-data MyDatabase > MyDatabase.sql
2016-03-21 21:38:37 +03:00
```
2016-07-09 20:18:34 +02:00
Create headers for them with provided Python script:
2016-03-19 21:13:16 +03:00
```
%sqlpp11_dir%/scripts/ddl2cpp ~/temp/MyTable.ddl ~/temp/MyTable %DatabaseNamespaceForExample%
```
2016-03-21 21:38:37 +03:00
(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.)
2016-07-09 20:18:34 +02:00
Include generated header (MyTable.h), that's all.
2016-03-19 21:13:16 +03:00
2016-07-09 20:18:34 +02:00
If you prefer Ruby over Python, you might want to take a look at https://github.com/douyw/sqlpp11gen
2013-08-13 22:43:10 +02:00
2017-09-17 09:03:45 +02:00
Contact:
--------
* Issues at https://github.com/rbock/sqlpp11/issues
* email at rbock at eudoxos dot de
* [![Join the chat at https://gitter.im/sqlpp11/Lobby ](https://badges.gitter.im/sqlpp11/Lobby.svg )](https://gitter.im/sqlpp11/Lobby?utm_source=badge& utm_medium=badge& utm_campaign=pr-badge& utm_content=badge)
Breaking changes in 0.36:
-------------------------
See [Changes ](ChangeLog.md )
2016-04-08 21:40:01 +02:00