“深入浅出”系列之QT:(13)QDjango

1. 数据库连接管理

QDjango 提供了简单且直观的接口来管理与各种数据库的连接。无论是常见的MySQL、PostgreSQL,还是SQLite 等数据库,开发者都可以通过QDjango 轻松地建立连接。例如,对于SQLite 数据库,连接代码可以简单如下:

#include <QDjango/QDjango>

int main() {
    QDjango::Database db = QDjango::Database::connect("my_database.db", QDjango::Database::Sqlite);
    if (!db.isOpen()) {
        qDebug() << "Database connection failed";
        return -1;
    }
    // 后续进行数据库操作
    db.close();
    return 0;
}

2. 数据模型定义

类似于Django 框架中的数据模型概念,QDjango 允许开发者以面向对象的方式定义数据模型。开发者可以将数据库表映射为C++ 类,每个类的属性对应表中的字段。例如,定义一个简单的用户数据模型:

#include <QDjango/QDjangoModel>

class User :public QDjangoModel<User> {
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(int age READ age WRITE setAge NOTIFY ageChanged)

public:
    QString name() const { return m_name; }
    int age() const { return m_age; }

    void setName(const QString& name) {
        if (m_name!= name) {
            m_name = name;
            emit nameChanged();
        }
    }

    void setAge(int age) {
        if (m_age!= age) {
            m_age = age;
            emit ageChanged();
        }
    }

signals:
    void nameChanged();
    void ageChanged();

private:
    QString m_name;
    int m_age;
};
QDJANGO_MANAGE(User)

3. 数据的增删改查操作

增加数据

使用QDjango 进行数据插入操作非常方便。例如,向User 表中插入一条新记录:

User user;
user.setName("John");
user.setAge(30);
if (user.save()) {
    qDebug() << "User saved successfully";
} else {
    qDebug() << "Failed to save user: " << user.lastError();
}
删除数据

删除数据同样简单。假设要删除名为“John”的用户记录:

User user;
user.setName("John");
if (user.remove()) {
    qDebug() << "User removed successfully";
} else {
    qDebug() << "Failed to remove user: " << user.lastError();
}
修改数据

对于数据的更新操作,先获取要修改的记录,然后修改其属性值并调用save 方法。例如,将名为“John”的用户年龄更新为31:

User user = User::objects().filter(QDjangoWhere("name = :name").bindValue(":name", "John")).first();
if (!user.isNull()) {
    user.setAge(31);
    if (user.save()) {
        qDebug() << "User updated successfully";
    } else {
        qDebug() << "Failed to update user: " << user.lastError();
    }
}
查询数据

QDjango 提供了强大的查询功能。可以使用filter 方法进行条件查询,all 方法获取所有记录,first 方法获取第一条记录等。例如,查询所有年龄大于30 的用户:

QList<User> users = User::objects().filter(QDjangoWhere("age > :age").bindValue(":age", 30)).all();
foreach (const User& user, users) {
    qDebug() << "Name: " << user.name() << ", Age: " << user.age();
}

4. 事务处理

在数据库操作中,事务处理是确保数据一致性和完整性的重要手段。QDjango 提供了简单易用的事务处理接口。例如,进行一个涉及多个数据操作的事务:

QDjango::Database db = QDjango::Database::connect("my_database.db", QDjango::Database::Sqlite);
if (db.isOpen()) {
    db.transaction();
    try {
        User user1;
        user1.setName("Alice");
        user1.setAge(25);
        if (!user1.save()) {
            throwstd::runtime_error("Failed to save user1");
        }

        User user2;
        user2.setName("Bob");
        user2.setAge(28);
        if (!user2.save()) {
            throwstd::runtime_error("Failed to save user2");
        }

        db.commit();
        qDebug() << "Transaction committed successfully";
    } catch (conststd::exception& e) {
        db.rollback();
        qDebug() << "Transaction rolled back: " << e.what();
    }
    db.close();
}

示例1:简单的用户管理系统

假设我们要开发一个简单的用户管理系统,使用QDjango 进行数据库操作。首先定义用户数据模型,如前文所示的User 类。然后实现一些基本的功能,如添加用户、查询用户列表等。

#include <QDjango/QDjango>
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QDjango::Database db = QDjango::Database::connect("users.db", QDjango::Database::Sqlite);
    if (!db.isOpen()) {
        qDebug() << "Database connection failed";
        return-1;
    }

    // 添加用户
    User user;
    user.setName("Tom");
    user.setAge(22);
    if (user.save()) {
        qDebug() << "User Tom saved successfully";
    } else {
        qDebug() << "Failed to save user Tom: " << user.lastError();
    }

    // 查询所有用户
    QList<User> users = User::objects().all();
    foreach (const User& user, users) {
        qDebug() << "User: Name - " << user.name() << ", Age - " << user.age();
    }

    db.close();
    return a.exec();
}
#include "main.moc"

示例2:更复杂的业务场景

假设有一个图书管理系统,涉及到图书、作者、借阅记录等多个数据模型。 定义图书数据模型:

class Book : public QDjangoModel<Book> {
    Q_OBJECT
    Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged)
    Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
    Q_PROPERTY(int publicationYear READ publicationYear WRITE setPublicationYear NOTIFY publicationYearChanged)

public:
    QString title() const { return m_title; }
    QString author() const { return m_author; }
    int publicationYear() const { return m_publicationYear; }

    void setTitle(const QString& title) {
        if (m_title!= title) {
            m_title = title;
            emit titleChanged();
        }
    }

    void setAuthor(const QString& author) {
        if (m_author!= author) {
            m_author = author;
            emit authorChanged();
        }
    }

    void setPublicationYear(int year) {
        if (m_publicationYear!= year) {
            m_publicationYear = year;
            emit publicationYearChanged();
        }
    }

signals:
    void titleChanged();
    void authorChanged();
    void publicationYearChanged();

private:
    QString m_title;
    QString m_author;
    int m_publicationYear;
};
QDJANGO_MANAGE(Book)

定义借阅记录数据模型:

class BorrowRecord : public QDjangoModel<BorrowRecord> {
    Q_OBJECT
    Q_PROPERTY(QDjangoForeignKey<Book> book READ book WRITE setBook NOTIFY bookChanged)
    Q_PROPERTY(QDateTime borrowDate READ borrowDate WRITE setBorrowDate NOTIFY borrowDateChanged)
    Q_PROPERTY(QDateTime returnDate READ returnDate WRITE setReturnDate NOTIFY returnDateChanged)

public:
    QDjangoForeignKey<Book> book() const { return m_book; }
    QDateTime borrowDate() const { return m_borrowDate; }
    QDateTime returnDate() const { return m_returnDate; }

    void setBook(const QDjangoForeignKey<Book>& book) {
        if (m_book!= book) {
            m_book = book;
            emit bookChanged();
        }
    }

    void setBorrowDate(const QDateTime& date) {
        if (m_borrowDate!= date) {
            m_borrowDate = date;
            emit borrowDateChanged();
        }
    }

    void setReturnDate(const QDateTime& date) {
        if (m_returnDate!= date) {
            m_returnDate = date;
            emit returnDateChanged();
        }
    }

signals:
    void bookChanged();
    void borrowDateChanged();
    void returnDateChanged();

private:
    QDjangoForeignKey<Book> m_book;
    QDateTime m_borrowDate;
    QDateTime m_returnDate;
};
QDJANGO_MANAGE(BorrowRecord)

实现一些业务逻辑,如添加图书、借阅图书等:

#include <QDjango/QDjango>
#include <QCoreApplication>
#include <QDebug>
#include <QDateTime>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    QDjango::Database db = QDjango::Database::connect("library.db", QDjango::Database::Sqlite);
    if (!db.isOpen()) {
        qDebug() << "Database connection failed";
        return-1;
    }

    // 添加图书
    Book book;
    book.setTitle("C++ Primer");
    book.setAuthor("Stanley Lippman");
    book.setPublicationYear(2012);
    if (book.save()) {
        qDebug() << "Book saved successfully";
    } else {
        qDebug() << "Failed to save book: " << book.lastError();
    }

    // 借阅图书
    BorrowRecord record;
    Book savedBook = Book::objects().filter(QDjangoWhere("title = :title").bindValue(":title", "C++ Primer")).first();
    if (!savedBook.isNull()) {
        record.setBook(savedBook);
        record.setBorrowDate(QDateTime::currentDateTime());
        if (record.save()) {
            qDebug() << "Borrow record saved successfully";
        } else {
            qDebug() << "Failed to save borrow record: " << record.lastError();
        }
    }

    db.close();
    return a.exec();
}
#include "main.moc"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值