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();
}
相关推荐
~光~~3 小时前
【环境配置 】WSL2 +ubuntu20.04 +Qt配置+Kits配置
开发语言·qt·ubuntu
老歌老听老掉牙8 小时前
基于 PyQt5 实现刀具类型选择界面的设计与交互逻辑
python·qt·交互
灵性花火14 小时前
Qt绘制折线图
qt
abcd_zjq16 小时前
【2025最新】【win10】vs2026+qt6.9+opencv(cmake编译opencv_contrib拓展模
人工智能·qt·opencv·计算机视觉·visual studio
abcd_zjq17 小时前
VS2026+QT6.9+opencv图像增强(多帧平均降噪)(CLAHE对比度增强)(边缘增强)(图像超分辨率)
c++·图像处理·qt·opencv·visual studio
Algebraaaaa18 小时前
Qt中的字符串宏 | 编译期检查和运行期检查 | Qt信号与槽connect写法
开发语言·c++·qt
友友马18 小时前
『 QT 』Hello World控件实现指南
开发语言·qt
誰能久伴不乏18 小时前
如何在 Linux_Ubuntu 上安装 Qt 5:详细教程
linux·qt·ubuntu
feiyangqingyun1 天前
有难度哦/Qt基于通用地图组件实现航迹规划和模拟/动态标注轨迹线/带序号和方向箭头指示
qt·航迹规划和模拟