sqlite实现全量连接

1、sqlite数据库执行full outer join失败

sqlite数据库执行full outer join时提示:RIGHT and FULL OUTER JOINs are not currently supported。

sqlite数据库不支持(+),不支持右外连接(right outer join)和全外连接(full outer join),但支持左外连接(left outer join)。我们可以利用这一点来得到全外连接的结果

2、曲线救国

以下aa、bb为数据表名

1.left outer join

select * From aa left outer join  bb on aa.id=bb.id

2.right outer join

select * from bb left outer join aa on aa.id=bb.id

3.full outer join

select aa.*,bb.* from aa left outer join bb on aa.id=bb.id union select aa.*,bb.* from bb left outer join aa on aa.id=bb.id

3、sqlite3读写效率优化

Sqlite3写性能优化-每秒百万条写入

4、sqlete3查询条件为比较数组

关键字,hex,x
sqlite - 与SQLite中的HEX()相反?

# x'fb71f32e000000000000' 会被转成一个数组 0xfb 0x71 ... 0x00 0x00
select * from t_RecordInfo where cardSid=x'fb71f32e000000000000'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Qt 中实现 SQLite3 连接池需要以下步骤: 1. 创建一个 SQLite3 连接类,其中包含打开 SQLite3 数据库的函数和关闭数据库的函数。 ```c++ // sqliteconnection.h #ifndef SQLITECONNECTION_H #define SQLITECONNECTION_H #include <QString> #include <QSqlDatabase> #include <QSqlError> class SQLiteConnection { public: static bool open(QString path); static void close(); static QSqlDatabase getConnection(); private: static QSqlDatabase db; }; #endif // SQLITECONNECTION_H ``` ```c++ // sqliteconnection.cpp #include "sqliteconnection.h" QSqlDatabase SQLiteConnection::db; bool SQLiteConnection::open(QString path) { db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName(path); if (!db.open()) { qDebug() << "Error: connection with database failed"; qDebug() << db.lastError().text(); return false; } qDebug() << "Database: connection ok"; return true; } void SQLiteConnection::close() { db.close(); } QSqlDatabase SQLiteConnection::getConnection() { return db; } ``` 2. 创建一个 SQLite3 连接池类,其中包含获取连接和释放连接的函数。 ```c++ // sqlitepool.h #ifndef SQLITEPOOL_H #define SQLITEPOOL_H #include <QObject> #include <QSqlDatabase> #include <QMutex> #include <QQueue> class SQLitePool : public QObject { Q_OBJECT public: static SQLitePool& getInstance(); QSqlDatabase getConnection(); void releaseConnection(QSqlDatabase conn); private: SQLitePool(QObject* parent = nullptr); ~SQLitePool(); SQLitePool(const SQLitePool&) = delete; SQLitePool& operator=(const SQLitePool&) = delete; QMutex mutex; QQueue<QSqlDatabase> pool; }; #endif // SQLITEPOOL_H ``` ```c++ // sqlitepool.cpp #include "sqlitepool.h" #include "sqliteconnection.h" SQLitePool::SQLitePool(QObject* parent) : QObject(parent) { } SQLitePool::~SQLitePool() { QMutexLocker locker(&mutex); while (!pool.isEmpty()) { QSqlDatabase conn = pool.dequeue(); conn.close(); } QSqlDatabase::removeDatabase("qt_sql_default_connection"); } SQLitePool& SQLitePool::getInstance() { static SQLitePool instance; return instance; } QSqlDatabase SQLitePool::getConnection() { QMutexLocker locker(&mutex); if (pool.isEmpty()) { return SQLiteConnection::getConnection(); } return pool.dequeue(); } void SQLitePool::releaseConnection(QSqlDatabase conn) { QMutexLocker locker(&mutex); if (conn.isOpen()) { pool.enqueue(conn); } } ``` 3. 在应用程序中使用连接池。 ```c++ // main.cpp #include <QCoreApplication> #include <QDebug> #include <QSqlQuery> #include "sqlitepool.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); SQLitePool& pool = SQLitePool::getInstance(); if (!SQLiteConnection::open("test.db")) { return -1; } QSqlDatabase conn1 = pool.getConnection(); QSqlQuery query1(conn1); query1.exec("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"); QSqlDatabase conn2 = pool.getConnection(); QSqlQuery query2(conn2); query2.exec("INSERT INTO users (name) VALUES ('Alice')"); QSqlDatabase conn3 = pool.getConnection(); QSqlQuery query3(conn3); query3.exec("SELECT * FROM users"); while (query3.next()) { qDebug() << query3.value(0).toInt() << query3.value(1).toString(); } pool.releaseConnection(conn2); QSqlDatabase conn4 = pool.getConnection(); QSqlQuery query4(conn4); query4.exec("INSERT INTO users (name) VALUES ('Bob')"); pool.releaseConnection(conn4); pool.releaseConnection(conn1); pool.releaseConnection(conn3); SQLiteConnection::close(); return a.exec(); } ``` 以上就是实现 SQLite3 连接池的基本步骤,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值