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();
}