首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

C++ MySQL 訪問庫 SOCI 介紹:輕量級資料庫映射框架

     編輯:MySQL 資料庫相關知識

選型背景

  • 需求:C++ 專案中更人性化的資料庫訪問,類似 Python/ORM 風格
  • 備選:SOCI(輕量、支援多後端)、Litesql(重、代碼生成)
  • 選擇:SOCI,Header-only 可選,依賴極少

環境準備

CREATE DATABASE soci;
CREATE TABLE tb_test (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(32) DEFAULT '',
  sex INT DEFAULT 0,
  UNIQUE KEY name (name)
);

核心 API 速覽

操作關鍵語法說明
連線session sql(backend, conn_str)支援 mysql, postgresql, sqlite3, oracle, odbc, firebird
參數綁定use(var) (輸入), into(var, ind) (輸出)indicator 處理 NULL
執行sql << "SQL", use(...), into(...)流式語法,編譯期檢查
事務transaction tr(sql); tr.commit()/rollback()RAII 風格

實戰範例

1. 單行查詢

session sql(mysql, "host=localhost db=soci user=dantezhu");
indicator ind;
string name = "dandan";
int sex;
sql << "SELECT sex FROM tb_test WHERE name = :name", into(sex, ind), use(name);
if (ind == i_ok) { /* 成功 */ }

2. 多行查詢(向量綁定)

int count;
sql << "SELECT COUNT(*) FROM tb_test", into(count, ind);
vector names(count);
vector sexes(count);
sql << "SELECT name, sex FROM tb_test WHERE sex = :sex", into(names), into(sexes), use(1);

3. 結構體映射(核心亮點)

struct Person { int id; string name; int sex; };

namespace soci {
template<> struct type_conversion {
  typedef values base_type;
  static void from_base(values const& v, indicator, Person& p) {
    p.id = v.get("id");
    p.name = v.get("name");
    p.sex = v.get("sex");
  }
  static void to_base(const Person& p, values& v, indicator& ind) {
    v.set("id", p.id); v.set("name", p.name); v.set("sex", p.sex);
    ind = i_ok;
  }
};}

使用結構體查詢

Person p;
sql << "SELECT id, name, sex FROM tb_test WHERE name = :name", into(p, ind), use(name);

使用結構體插入

Person p = {0, "niuniu", 2};
sql << "INSERT INTO tb_test(name, sex) VALUES(:name, :sex)", use(p);

已知限制

  • affected_rows() 無法直接獲取(需自行查詢)
  • 自增主鍵回填需額外 LAST_INSERT_ID() 查詢
  • 文檔範例中 template<> 寫法需注意命名空間

專案地址

原文代碼:vimercode/soci_test

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved