linux c++数据库sqlite3学习

linux下sqilte3安装:sudo apt-get install sqlite3
1,常见的脚本操作:
QL 语言操作数据库
.database 显示当前数据库
.table 显示当前数据库里的表格
.q .exit 退出,
2,数据类型:
integer 整数 : int, short, long
text 文本 : string
real 浮点型: float, double
blob 二进制
//每个语句按;结束
3,常用语句
//创建数据库在当前目录下
sqlite3 usr.db
//创建表格
create table stu(id int, name text, age integer, score int);
//查看表格所有内容:
select * from stu;
//查找表格里某个内容
select * from stu where id = 1001; //id为1001的一行
select id from stu where name = ‘Tom’;//名字为Tom的id
//向表格里增加内容:
insert into stu(id, name, age, score) values(1001, ‘Tom’, 12, 90);
//修改表格的内容
update stu set name = “Cindy” where id = 1002 and name = ‘Bob’;
//删除表格中的数据
delete from stu where id = 1001 and name = ‘Bob’;
//删除表格
drop table xiaoming;
id integer primary key(主键) autoincrement(自动增加)
4,sqlite3库的下载和编译以及运用:
下载库代码:https://download.csdn.net/download/qq_40008325/10978934
在程序运行的时候链接
创建动态库
gcc -o libsqlite.so -fPIC --shared sqlite3.c
./a.out -->执行的时候需要链接到动态库
//程序编译的过程已经把静态库链接到了可执行文件里
创建静态库
gcc -c sqlite3.c -o sqlite3.o
ar -r sqlite3.a sqlite3.o
./a.out
编译
链接静态库
g++ sqlite.cpp sqlite3.a -lpthread -ldl
自定义的文件
链接动态库
g++ sqlite.cpp -L ./ -lsqlite -lpthread -ldl
自定义的文件
//如果执行的时候找不到动态库,可以cp libsqlite.so /lib/

编译环境的构造:
下载连接中的代码,按上面编译出动态库和静态库,拷贝生成的库到相应文件下(可以自己指定路径)方便连接,而后拷贝sqlite3.h到我的项目文件下,方便头文件的查找。

#include <iostream>
#include <cstdio>
#include "sqlite3.h"
using namespace std;

//把sqlite3数据库的c语言操作形式改成一个c++的类

Sqlite sq("usr.db");
sq.exec("insert into stu values(200,'a', 32,33);");
sq.exec("select * from stu;");
class Sqlite
{
	sqlite3* pdb;
	char** buf;
	int r;
	int c;
public:
	Sqlite() {
	
	}
	~Sqlite() { }
	int exec(char* sql) {
		
	}
	int row() {
		return r;
	}

};
int main()
{
	sqlite3* pdb;
	int ok;
	ok = sqlite3_open("usr.db", &pdb);
	if (ok == SQLITE_OK) {
		cout << "打开数据库成功" << endl;
	} else {
		cout << "打开数据库失败" << endl;
		return 0;
	}
	//char sql[1024];
	string sql;
	char** buf = NULL;
	int row = 0;
	int col = 0;
	sql = "insert into stu values(1005, 'Lisa', 12, 89);";
	//增删改
	ok = sqlite3_exec(pdb, sql.c_str(), NULL, NULL, NULL);
	sql = "select * from stu;";
	//查
	ok = sqlite3_get_table(pdb, sql.c_str(), &buf, &row, &col, NULL);
	if (ok == SQLITE_OK) {
		cout << "操作成功" << endl;
	} else {
		cout << "操作失败" << endl;
		return 0;
	}
//	buf == char* []; buf指向一个一维char*数组
//	[0]  [1]    [2]   [3]     [4] ...
//	"id" "name" "age" "score" 
//	"1001" "Tom" "12"  "90"
//	"1002" "Tom" "12"  "90"
//	row = 2; col = 4; row不包含表头
	for (int i=0; i<(row+1)*col; i++) {
		cout << buf[i] << " ";
		if ((i+1) % col == 0)
			cout << endl;
	}
	if (buf != NULL)
		sqlite3_free_table(buf); //释放buf指向的表格

	sqlite3_close(pdb);
	return 0;
}

sqlite3的简单封装

#include <iostream>
#include "sqlite3.h"
#include <cstdio>
using namespace std;
struct Student {
	int id;
	string name;
	int age;
	int score;
};
struct Teacher {
	int id;
	string name;
	int age;
	string subject;
};
class Sqlite
{
protected:
	sqlite3* pdb;
	int r;
	int c;
	int ok;
	char** buf;
public:
	Sqlite(const char* database) : 
		r(0), c(0), buf(NULL), ok(SQLITE_ERROR) 
	{
		ok = sqlite3_open(database, &pdb);
		if (ok == SQLITE_OK) 
			cout << "打开成功" << endl;
		else
			cout << "打开失败" << endl;
	}
	~Sqlite() {
		if (buf != NULL) {
			cout << "释放表格" <<endl;
			sqlite3_free_table(buf);
		}
		if (is_open()) {
			sqlite3_close(pdb);
			cout << "关闭数据库" << endl;
		}
	}
	int exec(const string& s) {
		if (! is_open())
			return SQLITE_ERROR;
		if (s[0] == 's') {
			if (buf != NULL)
				sqlite3_free_table(buf);
			return sqlite3_get_table(pdb, s.c_str(), &buf, &r, &c, NULL); 
		} else {
			return sqlite3_exec(pdb, s.c_str(), NULL, NULL, NULL);
		}
	}
	void show_table() {
		if (buf == NULL)
			return;
		for (int i=0; i<(r+1)*c; i++)
		{
			cout << buf[i] << " ";
			if ((i+1) %c == 0)
				cout << endl;
		}
	}
	bool is_open() {
		return ok == SQLITE_OK;
	}
	char** operator[](int n) {
		return buf + c*(n);
	}
};
//is-a
class StudentSqlite : public Sqlite
{
	char sql[1024];
public:
	StudentSqlite(const char* db) : Sqlite(db) { }
	void insert(const Student& s) {
		sprintf(sql, "insert into stu values(%d, '%s', %d, %d);", s.id, s.name.c_str(), s.age, s.score);
		if (exec(sql) != SQLITE_OK) {
			cout << "增加学生失败" << endl;
		}
	}
};
//has-a
class TeacherSqlite 
{
	char sql[1024];
	Sqlite sqlite;
public:	
	TeacherSqlite(const char* db) : sqlite(db) { }
	void insert(const Teacher& t) {
		sprintf(sql, "insert into tea values(%d, '%s', %d, \'%s\');", t.id, t.name.c_str(), t.age, t.subject.c_str());
		if (sqlite.exec(sql) != SQLITE_OK) {
			cout << "增加教师失败" << endl;
		}
	}
	void show_table() {
		sqlite.exec("select * from tea;");
		sqlite.show_table();
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开缓缓归以

你的鼓励将是我创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值