SQLite数据库移植
2023-05-31 来源:elecfans
SQLite是一款轻型的数据库,它遵守ACID的关系型数据库管理系统,包含在一个相对小的C库中。它的设计目标是嵌入式系统,目前已经在很多嵌入式产品中使用,其占用资源非常低,在嵌入式设备中,只需要几百K的内存就够了。SQLite能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,还具有ODBC接口,比起MySQL、PostgreSQL这两款开源的著名数据库管理系统来,它的处理速度比他们都要快。同时,SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。SQLite是一个零配置的数据库,这意味着与其他数据库不一样,它不需要在系统中配置。
下面就来讨论一下,如何把SQLite移植到嵌入式Linux系统中。以下是在S3C2416嵌入式开发板上(Linux3.6.6内核)移植SQLite3.33.0的具体步骤。
1、通过官网(https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz)或其他网站下载SQLite3.33.0的源码,本例下载的压缩包名为sqlite-autoconf-3330000.tar.gz(注意一定要下载自动配置的autoconf版本)。
2、执行命令“tar -zxvf sqlite-autoconf-3330000.tar.gz -C /tmp”,把源码解压到“/tmp”目录下。
3、进入解压好的源码目录,然后执行命令“./configure --prefix=/opt/SQLite3 --target=arm-linux --host=arm-linux LD=arm-linux-ld”,对源码进行配置,安装路径配置为“/opt/SQLite3”。
4、配置完成后执行命令“make”对源码进行编译。
5、编译完成后执行命令“make install”进行本地安装。
6、安装完成后执行“cd /opt/SQLite3”进入安装目录,可发现编译好的SQLite3.33.0就安装在该目录下,会有bin、include、lib和share等4个目录。
7、拷贝bin目录下生成的可执行文件sqlite3到嵌入式开发板上的“/usr/bin”目录下。
8、拷贝lib目录下以libsqlite3.so开头的库文件到嵌入式开发板上的“/usr/lib”目录下,拷贝时注意要保持原有的链接(cp命令加参数“-d”)。
9、在开发板上执行sqlite3即可启动sqlite3.33.0了,如下图所示。
退出SQLite用命令“.exit”(或“.quit”)。
下面来测试一下,先建立一个名为test.db的数据库文件,然后再向里面写入两条数据,具体如下图所示。
接下来编写一个C程序来读取上面建立的test.db数据库及表,代码如下。
#include 把上述代码存为一个名为SQLitetest.c的程序文件,然后进行交叉编译。 由于在编译时要用到SQLite中的库文件和头文件,所以需要在编译时加下库文件和头文件所在的路径。 执行“arm-linux-gcc SQLitetest.c -o SQLitetest -I /opt/SQLite3/include -L /opt/SQLite3/lib -l sqite3”进行交叉编译,其中的库文件和头文件路径为前面编译安装SQLite3时的路径。完成后会生成可执行文件SQLitetest,然后把它拷贝到嵌入式开发板上。 在嵌入式开发板上执行./SQLitetest /test.db 'select * from tbl',就可以看到程序读取数据库的效果了,如下图所示。 至此,证明SQLite3数据库移植成功!
#include
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for(i=0; i
printf('%s = %sn', azColName[i], argv[i]?argv[i]:'NULL');
printf('n');
return 0;
}
int main(int argc, char **argv)
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if(argc != 3)
{
fprintf(stderr, 'Usage: %s DATABASE SQL-STATEMENTn', argv[0]);
return 1;
}
rc = sqlite3_open(argv[1], &db);
if(rc)
{
fprintf(stderr, 'Can't open database: %sn', sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if(rc != SQLITE_OK)
{
fprintf(stderr, 'SQL error: %sn', zErrMsg);
sqlite3_free(zErrMsg);
}
sqlite3_close(db);
return 0;
}