一、数据库基础与C语言环境搭建
各位同学,咱们今天聊点实在的。很多人一听到「数据库」三个字,脑子里就浮现出Oracle、MySQL那些庞然大物,觉得离C语言很远。其实不然。我个人习惯把数据库看作一个「有组织的文件柜」——你往里面存数据,按规矩取出来,就这么简单。而SQLite,就是这个文件柜的轻量级实现,特别适合咱们嵌入式C语言的场景。
1.1 关系型数据库到底是个啥?
说白了,关系型数据库就是一张张表格的集合。你想想看,Excel表格你总用过吧?行是记录,列是字段,表之间通过某个共同字段关联起来——这就是「关系」二字的由来。
我在项目中遇到过不少新手,上来就问:「为什么不用文本文件存数据?」嗯,文本文件当然可以,但你要做查询、排序、多表关联的时候,自己写代码实现这些功能,那工作量可就大了去了。数据库帮你把这些脏活累活都干了,你只需要告诉它「我要什么」,不用管「怎么找」。
- 表(Table):数据的容器,类似Excel的sheet
- 行(Row):一条完整的记录
- 列(Column):记录的某个属性
- 主键(Primary Key):唯一标识一行数据的字段
- 外键(Foreign Key):关联其他表的字段
1.2 SQLite——嵌入式数据库的瑞士军刀
SQLite有什么特别的?它不是一个独立的服务器进程,而是一个库,直接链接到你的C程序中。你的程序调用SQLite的API,它就在本地文件上读写数据,不需要网络,不需要配置,连安装都省了。
我曾经在一个ARM Cortex-M4的板子上跑SQLite,整个库编译下来才600KB左右。你想想看,这点资源占用,在嵌入式领域简直是福音。而且它支持标准的SQL语法,你在MySQL上学的那套CRUD操作,在这里基本都能用。
| 特性 | SQLite | MySQL/PostgreSQL |
|---|---|---|
| 部署方式 | 库文件,直接链接 | 独立服务进程 |
| 资源占用 | 几百KB | 几百MB起步 |
| 配置复杂度 | 零配置 | 需要用户、权限、网络配置 |
| 适用场景 | 嵌入式、移动端、桌面小工具 | 高并发、大型Web应用 |
1.3 C语言开发环境配置(MinGW / VS)
环境配置这块,我踩过不少坑。咱们分两个主流方案来讲。
方案一:MinGW(Windows上的GCC)
我个人习惯用MinGW,轻量、跨平台、跟Linux上的GCC体验一致。你下载安装后,记得把bin目录加到系统PATH里。验证方法很简单:打开命令行,输入gcc --version,能看到版本号就对了。
# 检查GCC是否安装成功
gcc --version
# 编译一个测试文件
gcc -o hello hello.c
方案二:Visual Studio
如果你更习惯IDE,VS的C/C++开发体验也很成熟。新建一个控制台项目,把SQLite的源文件拖进去,直接编译就行。不过要注意:VS默认使用MSVC编译器,有些C99特性支持得不太好,编译SQLite时可能需要加几个宏定义。
strncpy_s的警告。后来发现是SDL安全检查搞的鬼。在项目属性 -> C/C++ -> 命令行 里加上 /D _CRT_SECURE_NO_WARNINGS 就清净了。
1.4 SQLite库的编译与链接
SQLite的源码就一个sqlite3.c文件和对应的头文件sqlite3.h。你不需要什么复杂的构建系统,直接把它跟你的程序一起编译就行。
# 单文件编译(最简单的方式)
gcc -o myapp myapp.c sqlite3.c -lpthread -ldl
# 或者先编译成目标文件,再链接
gcc -c sqlite3.c -o sqlite3.o
gcc -c myapp.c -o myapp.o
gcc myapp.o sqlite3.o -o myapp -lpthread -ldl
注意后面的-lpthread -ldl,这是SQLite在多线程和动态加载时需要的系统库。如果你在Windows上用MinGW,可能还需要加-lws2_32。嗯,这里有个小技巧:你可以用pkg-config来管理这些链接参数,不过SQLite太轻量了,我一般直接手写。
sqlite3_libversion()函数,打印出版本号。如果能输出类似"3.45.1"这样的字符串,说明库已经正确链接了。
#include <stdio.h>
#include "sqlite3.h"
int main() {
printf("SQLite version: %s\n", sqlite3_libversion());
return 0;
}
知识体系总览
下面这张图,把本章的核心脉络串起来了。你可以把它当作一张地图,后续学习时随时回来对照。
好了,这一章的内容就到这里。环境搭好之后,下一章我们就可以真正动手写代码了——用C语言连接SQLite,执行第一条SQL语句。到时候你会发现,原来在C里操作数据库,跟玩似的。
公众号:蓝海资料掘金营,微信deep3321