如果还是不行,建议将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();
}