QxOrm的使用-数据操作--增删改查

简介: 上一篇我们讲了QxOrm的基本的数据映射操作,这里面再补充一点东西

QxOrm的使用-数据操作

上一篇我们讲了QxOrm的基本的数据映射操作,这里面再补充一点东西


 ●  数据类型映射

Qt/C++类型 数据库类型
bool SMALLINT
qx_bool SMALLINT
short SMALLINT
int INTEGER
long INTEGER
long long INTEGER
float FLOAT
double FLOAT
long double FLOAT
unsigned short SMALLINT
unsigned int INTEGER
unsigned long INTEGER
unsigned long long INTEGER
std::string TEXT
std::wstring TEXT
QString TEXT
QVariant TEXT
QUuid TEXT
QDate DATE
QTime TIME
QDateTime TIMESTAMP
QByteArray BLOB
qx::QxDateNeutral TEXT
qx::QxTimeNeutral TEXT
qx::QxDateTimeNeutral TEXT

 ●  注册瞬态数据成员


我们以person为例子


person.h

#ifndef QXORMDEMO_PERSON_H
#define QXORMDEMO_PERSON_H
#include "precompiled.h"
#include "export.h"
#include <QDateTime>
class person
{
public:
    long id;
    QString firstName;
    QString lastName;
    QDateTime birthDate;
    int age;
};
QX_REGISTER_HPP_APP(person, qx::trait::no_base_class_defined, 0)
#endif //QXORMDEMO_PERSON_H

person.cpp

#include "person.h"
QX_REGISTER_CPP_APP(person)
namespace qx
{
    template <> void register_class(QxClass<person> & t)
    {
        t.setName("t_person");    
        t.id(& person::id, "id"); 
        t.data(& person::firstName, "first_name"); 
        t.data(& person::lastName, "last_name");  
        t.data(& person::birthDate, "birth_date"); 
        // 注册瞬态数据成员,一下两种二选一:
        // t.data(& person::age, "age", 0, true, false);
        IxDataMember * pDataMember = t.data(& person::age, "age");
        pDataMember->setDao(false);
    }
}

使用该方法可以看到数据库内没有生成age字段,但是类内是有该字段的。


瞬态数据成员是为了方便序列化或者自检等。


 ●  数据库的连接


在main函数内看到的以下代码:

qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
qx::QxSqlDatabase::getSingleton()->setDatabaseName("./demo.db");
qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
qx::QxSqlDatabase::getSingleton()->setUserName("root");
qx::QxSqlDatabase::getSingleton()->setPassword("");

该段代码是使用QxSqlDatabase内的单例类来连接数据库的,该方式是跨线程的。其他方式暂且不介绍,如果有需要则到官网查看。


使用QxOrm对数据库进行增删改查

接下来我们使用person类来做基本的增删改查操作,QxOrm提供了多种函数,这里只介绍最基本的,如果你想深入学习,可以到源码中去查看QxOrm的文档

新增数据


main.cpp

#include <QApplication>
#include "precompiled.h"
#include "person.h"
#include "author.h"
#include "author2.h"
#include "turbo_log.h"
void databaseInit()
{
    qx::QxSqlDatabase::getSingleton()->setDriverName("QSQLITE");
    qx::QxSqlDatabase::getSingleton()->setDatabaseName("./demo.db");
    qx::QxSqlDatabase::getSingleton()->setHostName("localhost");
    qx::QxSqlDatabase::getSingleton()->setUserName("root");
    qx::QxSqlDatabase::getSingleton()->setPassword("");
}
void createTable()
{
    QSqlError daoError = qx::dao::create_table<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table person:" + daoError.text().toStdString());
    }
    daoError = qx::dao::create_table<author>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table author:" + daoError.text().toStdString());
    }
    daoError = qx::dao::create_table<author2>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table author2:" + daoError.text().toStdString());
    }
}
void insertData()
{
    person p;
    p.firstName = "张三";
    p.lastName = "张三2";
    p.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
    p.age = 23;
    QSqlError daoError =  qx::dao::insert(p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("insert person:" + daoError.text().toStdString());
    }
    person p2;
    p2.firstName = "李四";
    p2.lastName = "李四2";
    p2.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
    p2.age = 23;
    daoError = qx::dao::save(p2);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("save person:" + daoError.text().toStdString());
    }
}
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    databaseInit();
    insertData();
    return app.exec();
}

我们在main函数中执行插入, qx::dao::save 和 qx::dao::insert都可以进行插入,区别在于如果save的数据的id是存在的则修改数据。


如果你想测试对应的数据,则给person设置id之后执行save和insert就可以看出区别。

person p;
p.id = 1;
p.firstName = "王二麻";
p.lastName = "王二麻2";
p.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
p.age = 23;
QSqlError daoError =  qx::dao::save(p);
if (daoError.type() != QSqlError::NoError)
{
    TurboLog::instance().getConsoleLogger()->error("insert person:" +      daoError.text().toStdString());
}

删除数据

QxOrm提供了如下函数删除数据

qx::dao::delete_by_query
qx::dao::delete_by_id
qx::dao::delete_all
qx::dao::destory_by_query
qx::dao::destory_by_id
qx::dao::destory_all

如果没有定义软删除的话 destory和delete都是把数据删除了。

void deleteData()
{
    person p;
    qx_query query;
    query.where("id").isEqualTo(2);
    QSqlError daoError =  qx::dao::delete_by_query<person>(query);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
    qx_query query2;
    query2.where("id").isEqualTo(1);
    daoError =  qx::dao::destroy_by_query<person>(query2);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
}

如果定义了软删除行为的话。


person.h

#ifndef QXORMDEMO_PERSON_H
#define QXORMDEMO_PERSON_H
#include "precompiled.h"
#include "export.h"
#include <QDateTime>
class person
{
public:
    long id;
    QString firstName;
    QString lastName;
    QDateTime birthDate;
    QDateTime deleteData;
    int age;
};
QX_REGISTER_HPP_APP(person, qx::trait::no_base_class_defined, 0)
#endif //QXORMDEMO_PERSON_H

person.cpp

#include "person.h"
QX_REGISTER_CPP_APP(person)
namespace qx
{
    template <> void register_class(QxClass<person> & t)
    {
        t.setName("t_person");           
        t.id(& person::id, "id");             
        t.data(& person::firstName, "first_name");   
        t.data(& person::lastName, "last_name"); 
        t.data(& person::birthDate, "birth_date");
        // t.data(& person::age, "age", 0, true, false);
        IxDataMember * pDataMember = t.data(& person::age, "age");
        pDataMember->setDao(false);
        t.setSoftDelete(qx::QxSoftDelete("deleteData"));
    }
}

使用delete 数据不会被实际删除。


main.cpp

void deleteData()
{
    QSqlError daoError =  qx::dao::delete_all<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
}

629c21e600ff492393698929f1b88893.png

使用destory 数据会被实际删除。

void deleteData()
{
    QSqlError daoError =  qx::dao::destroy_all<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
}

最后by_id的用法和查找的那个by_id是一致的,我这里不再贴代码了。


修改数据

使用qx::dao::update 更新数据库数据,注意:未赋值的字段将被更新为默认值或者空,此操作需要将字段赋值全

person p;
p.id = 3;
p.firstName = "王五";
p.lastName = "王五2";
p.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
p.age = 23;
QSqlError daoError =  qx::dao::update(p);
if (daoError.type() != QSqlError::NoError)
{
    TurboLog::instance().getConsoleLogger()->error("insert update:" + daoError.text().toStdString());
}

QxOrm提供了一种脏模式更新数据库qx::dao::update_optimized但是不建议使用。


查询数据

上面修改的时候,如果你的数据不全则更新的字段也会出问题,最好的方式是线查询出来再更新某个字段。


我们可以使用qx::dao::fetch_all查询全部数据。

void selectData()
{
    QList<person> persons;
    QSqlError daoError =  qx::dao::fetch_all(persons);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("select persons:" + daoError.text().toStdString());
    }
    TurboLog::instance().getConsoleLogger()->info("persons: {}", persons.size());
}

可以打印出总数据数量为4;


同样的我们可以使用qx::dao::fetch_by_id 精确查询某条数据。

void selectData()
{
    person p;
    p.id = 3;
    QSqlError daoError =  qx::dao::fetch_by_id(p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("select persons:" + daoError.text().toStdString());
    }
    TurboLog::instance().getConsoleLogger()->info("persons: {}", p.firstName.toStdString());
}

可以打印出总数据数量为p.firstName为王五;


同样的我们可以使用qx::dao::fetch_by_query 按照自己想要的条件搜索

mvoid selectData()
{
    person p;
    qx_query query;
    query.where("id").isEqualTo(2);
    QSqlError daoError =  qx::dao::fetch_by_query(query, p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("select persons:" + daoError.text().toStdString());
    }
    TurboLog::instance().getConsoleLogger()->info("persons: {}", p.firstName.toStdString());
}

可以打印出总数据数量为p.firstName为张三;

目录
相关文章
|
12月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
1421 4
|
11月前
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
10月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
10月前
|
人工智能 Java 关系型数据库
使用数据连接池进行数据库操作
使用数据连接池进行数据库操作
236 11
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
1026 77
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
834 174
|
11月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
1011 0

热门文章

最新文章