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();
}
相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能16 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G16 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt