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();
}
相关推荐
sycmancia1 小时前
Qt——编辑交互功能的实现
开发语言·qt
qq_401700416 小时前
Qt 项目中使用 QSS 的全面总结
开发语言·qt
小短腿的代码世界6 小时前
信号路由风暴:Qt算法交易系统的高频信号分发架构
qt·算法·架构
郝学胜-神的一滴8 小时前
Qt 高级开发 010: 从跨界面传值到自定义信号
开发语言·c++·qt·程序人生·用户界面
Hua-Jay12 小时前
OpenCV联合C++/Qt 学习笔记(二十三)----图像校正及单目位姿估计
c++·笔记·qt·opencv·学习·计算机视觉
mirror_zAI13 小时前
C++ 仿 QQ 聊天室项目:Qt 客户端 + epoll 服务端 + Reactor 架构(含源码)
c++·qt·架构
Hua-Jay14 小时前
OpenCV联合C++/Qt 学习笔记(二十四)----差值法检测移动物体、稠密光流法跟踪移动物体及稀疏光流法跟踪移动物体
c++·笔记·qt·opencv·学习·计算机视觉
我在人间贩卖青春15 小时前
重学Qt——对话框和多窗口程序设计
qt
努力努力再努力wz15 小时前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
程序leo源1 天前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#