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