/Nut

Advanced, Powerful and easy to use ORM for Qt

Primary LanguageC++GNU Lesser General Public License v3.0LGPL-3.0

Nut

CI build GitLicense Codacy Badge

Advanced, Powerful and easy to use ORM for Qt5

Features

  • Easy to use
  • Support PosgtreSQL, MySQL, SQLite and Microsoft Sql Server
  • Automatically create and update database
  • Support for IDE autocomplete. No hard-coding is needed
  • Detecting table joins
  • Support common C++ and Qt-specific types (Full list)
  • Bulk insertation

Qick start

Create table

sampletable.h

#ifndef SAMPLETABLE_H
#define SAMPLETABLE_H

#include <QtNut/table.h>

class SampleTable : public Nut::Table
{
    Q_OBJECT
    Q_PROPERTY(int id READ id WRITE setId NOTIFY idChanged)
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)

    int m_id;
    QString m_name;

    // BEGIN OF NUT MACROS
    NUT_PRIMARY_KEY(id)
    NUT_FIELD(int, id)
    NUT_FIELD(QString, name)
    //END OF NUT MACROS

public:
    explicit SampleTable(QObject *parent = nullptr);

    int id() const;
    QString name() const;

public Q_SLOTS:
    void setId(int id);
    void setName(QString name);

Q_SIGNALS:
    void idChanged(int id);
    void nameChanged(QString name);
};

#endif // SAMPLETABLE_H

sampletable.cpp:

#include "sampletable.h"

SampleTable::SampleTable(QObject *parent) : Nut::Table(parent)
{
    init();
}

int SampleTable::id() const
{
    return m_id;
}

QString SampleTable::name() const
{
    return m_name;
}

QString SampleTable::lastName() const
{
    return m_lastName;
}

void SampleTable::setId(int id)
{
    if (m_id == id)
        return;

    m_id = id;
    Q_EMIT idChanged(m_id);
}

void SampleTable::setName(QString name)
{
    if (m_name == name)
        return;

    m_name = name;
    Q_EMIT nameChanged(m_name);
}

Create database

sampledatabase.h

#ifndef SAMPLEDATABASE_H
#define SAMPLEDATABASE_H

#include <QtNut/Database>

class SampleTable;
class SampleDataBase : public NUT_WRAP_NAMESPACE(Database)
{
    Q_OBJECT
    NUT_DB_VERSION(1)
    NUT_DECLARE_TABLE(SampleTable, items)

public:
    SampleDataBase();
};

#endif // SAMPLEDATABASE_H

sampledatabase.cpp

#include "sampledatabase.h"
#include "sampletable.h"

SampleDataBase::SampleDataBase() : Nut::Database()
  , m_items(new Nut::TableSet<SampleTable>(this))
{

}

Sample codes:

qRegisterMetaType<SampleTable*>();
qRegisterMetaType<SampleDataBase*>();

db.setDriver("QSQLITE");
db.setDatabaseName("data.sb");

if (db.open()) {
    qFatal() << "Unable to open the database";
}


// Read add rows from database
auto list = db.items()->query().toList();
// list is QList<QSharedPointer<SampleTable>>
    
//Select all the people named David.
auto onlyDavids = db.items()->query().where(SampleTable::nameField() == "David").toList();
onlyDavids.at(0)->setName("John"); // change him name to John
db.saveChanges(); // save changed to the database

// Remove all Johns from the database
db.items()->query().where(SampleTable::nameField() == "John").remove();

// Select rows with folowwing ids: 1, 4, 5, 6
db.items()->query().where(SampleTable::idField().in({1, 4, 5, 6}));

// Select from id 10 to 20
db.items()->query().where(SampleTable::idField().between(10, 20));

// Some other samples
db.items()->query().where(SampleTable::idField() <= 7);
db.items()->query().where(SampleTable::idField() > 0 || SampleTable::idField() == -3);
db.items()->query().where(SampleTable::idField() > 10 && (SampleTable::nameField() == "John" || SampleTable::nameField() == "Jim"));

// Select biggest id
auto biggestId = db.items()->query().max(SampleTable::idField());

Getting started

Help needed!

We need more documentation or wiki. If you can help to improve docs please fork now!

Technology sponsership

Thanks to JetBrains to their useful IDEs.

JetBrains Logo (Main) logoCLion logo