QT中加载PSQL驱动

如果还是不行,建议将PostgreSQL安装目录中bin文件夹下所有的dll文件全部拷贝至程序可执行文件同级目录中,确保驱动能够正确加载后,再一中共个个试验,把冗余的dll文件删除。

复制代码
#include "MainWindow.h"

#include <QApplication>
#include <QCoreApplication>
#include <QApplication>
#include <QDebug>
#include "duckdb.hpp"
#include <QElapsedTimer>
#include <QSqlQueryModel>

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QElapsedTimer>
#include <QDebug>
#include <QSqlDatabase>
#include <QDate>
#include <QTime>


using namespace duckdb;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // ===================== PostgreSQL =====================
    {
        QString path = "D:/Demo/untitled8/sqldrivers";
        QCoreApplication::addLibraryPath(path);
        qDebug() << "Qt library paths:" << QCoreApplication::libraryPaths();
        qDebug() << "Available SQL drivers:" << QSqlDatabase::drivers();

        QSqlDatabase db2 = QSqlDatabase::addDatabase("QPSQL", "psql");
        db2.setHostName("localhost");
        db2.setDatabaseName("postgres");
        db2.setUserName("postgres");
        db2.setPassword("Jatjat!@#$%");
        db2.setPort(5432);

        if (!db2.open()) {
            qDebug() << "PostgreSQL open failed:" ;
        } else {
            QSqlQuery query(db2);
            query.exec("DROP TABLE IF EXISTS dates");
            query.exec("CREATE TABLE dates (d DATE, t TIME, ts TIMESTAMP)");

            // 插入 100 万条数据
            db2.transaction();
            query.prepare("INSERT INTO dates (d, t, ts) VALUES (?, ?, ?)");
            QElapsedTimer timer1;
            timer1.start();
            for(int i=0;i<1000000;++i){
                query.addBindValue(QDate(1992,1,1));
                query.addBindValue(QTime(1,1,1));
                query.addBindValue(QDateTime(QDate(1992,1,1), QTime(1,1,1)));
                query.exec();
            }
            db2.commit();
            qDebug() << "PostgreSQL 插入耗时(ms):" << timer1.elapsed();

            // UPDATE 测试
            QElapsedTimer timer2;
            timer2.start();
            db2.transaction();
            query.exec("UPDATE dates SET ts = '2025-01-01 01:01:01' WHERE d = '1992-01-01'");
            db2.commit();
            qDebug() << "PostgreSQL UPDATE 耗时(ms):" << timer2.elapsed();

            // SELECT 查询测试
            QElapsedTimer timer3;
            timer3.start();
            query.exec("SELECT * FROM dates");
            int rowCount = 0;
            while(query.next()) {
                ++rowCount; // 可以只计数,不取值,避免额外开销
            }
            qDebug() << "PostgreSQL SELECT 耗时(ms):" << timer3.elapsed()
                     << "行数:" << rowCount;
        }
    }

    // ===================== DuckDB =====================
    {
        DuckDB db("D:/test.duckdb");
        Connection con(db);
        con.Query("DROP TABLE IF EXISTS dates");
        con.Query("CREATE TABLE dates (d DATE, t TIME, ts TIMESTAMP)");

        Appender appender(con, "dates");
        QElapsedTimer timer;
        timer.start();
        for(int i = 0;i< 1000000;++i){
            appender.AppendRow(
                Value::DATE(1992, 1, 1),
                Value::TIME(1, 1, 1, 0),
                Value::TIMESTAMP(1992, 1, 1, 1, 1, 1, 0)
                );
        }
        appender.Flush(); // 提交数据
        qDebug()<< "DuckDB 插入耗时(ms):"<< timer.elapsed();

        // UPDATE 测试
        QElapsedTimer timer2;
        timer2.start();
        con.Query("UPDATE dates SET ts = '2025-01-01 01:01:01' WHERE d = '1992-01-01'");
        qDebug() << "DuckDB UPDATE 耗时(ms):" << timer2.elapsed();

        // SELECT 查询测试
        QElapsedTimer timer3;
        timer3.start();
        auto result = con.Query("SELECT * FROM dates");
        int rowCount = result->RowCount();
        qDebug() << "DuckDB SELECT 耗时(ms):" << timer3.elapsed()
                 << "行数:" << rowCount;
    }

    // ===================== SQLite =====================
    {
        QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE");
        db1.setDatabaseName("D:/test.sqlite");
        if (!db1.open()) {
            qDebug() << "not open SQLite";
        }
        QSqlQuery query(db1);
        query.exec("DROP TABLE IF EXISTS dates");
        query.exec("CREATE TABLE IF NOT EXISTS dates (d TEXT, t TEXT, ts TEXT)");

        // 插入 100 万条数据
        db1.transaction();
        query.prepare("INSERT INTO dates (d, t, ts) VALUES (?, ?, ?)");
        QElapsedTimer timer1;
        timer1.start();
        for (int i = 0; i < 1000000; ++i) {
            query.addBindValue("1992-01-01");
            query.addBindValue("01:01:01");
            query.addBindValue("1992-01-01 01:01:01");
            query.exec();
        }
        db1.commit();
        qDebug() << "SQLite 插入耗时(ms):" << timer1.elapsed();

        // UPDATE 测试
        QElapsedTimer timer2;
        timer2.start();
        db1.transaction();
        query.exec("UPDATE dates SET ts = '2025-01-01 01:01:01' WHERE d = '1992-01-01'");
        db1.commit();
        qDebug() << "SQLite UPDATE 耗时(ms):" << timer2.elapsed();

        // SELECT 查询测试
        QElapsedTimer timer3;
        timer3.start();
        query.exec("SELECT * FROM dates");
        int rowCount = 0;
        while(query.next()) {
            ++rowCount;
        }
        qDebug() << "SQLite SELECT 耗时(ms):" << timer3.elapsed()
                 << "行数:" << rowCount;
    }


    return a.exec();
}
相关推荐
火山灿火山8 分钟前
初识Qt(使用不同中方式创建helloworld)
开发语言·qt
永不停转2 小时前
关于 QGraphicsItemGroup 内部项目发生变化后group重新定位的问题
c++·qt
带土13 小时前
5. QT之Q_OBJECT详解
开发语言·qt
leon_zeng013 小时前
Qt Modern OpenGL 入门:从零开始绘制彩色图形
开发语言·qt·opengl
会飞的胖达喵13 小时前
Qt CMake 项目构建配置详解
开发语言·qt
寻找华年的锦瑟19 小时前
Qt-FFmpeg案例(0基础,包含环境配置)
开发语言·qt·ffmpeg
共享家95271 天前
QT-界面优化(上)
开发语言·qt
__BMGT()1 天前
参考文章资源记录
开发语言·c++·qt
lqj_本人1 天前
鸿蒙原生与Qt混合开发:性能优化与资源管理
qt·harmonyos
lqj_本人1 天前
鸿蒙Qt字体实战:消灭“豆腐块“乱码与自定义字体加载
qt·华为·harmonyos