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"