sqllite3命令行下的常用命令及接口

来源:互联网 发布:对p2p网络借贷的看法 编辑:程序博客网 时间:2024/04/19 14:01

 工欲善其事,必先利其器。学好SQLite的命令行工具,对于我们学习SQLite本身而言是非常非常有帮助的。最基本的一条就是,它让我们学习SQLite的过程更加轻松愉快。言归正传吧,在SQLite的官方下载网站,提供了支持多个平台的命令行工具,使用该工具我们可以完成大多数常用的SQLite操作,就像sqlplus之于Oracle。以下列表给出了该工具的内置命令:

命令名命令说明.help列出所有内置命令。.backup DBNAME FILE备份指定的数据库到指定的文件,缺省为当前连接的main数据库。.databases列出当前连接中所有attached数据库名和文件名。.dump TABLENAME ...以SQL文本的格式DUMP当前连接的main数据库,如果指定了表名,则只是DUMP和表名匹配的数据表。参数TABLENAME支持LIKE表达式支持的通配符。.echo ON|OFF打开或关闭显示输出。.exit退出当前程序。.explain ON|OFF打开或关闭当前连接的SELECT输出到Human Readable形式。.header(s) ON|OFF在显示SELECT结果时,是否显示列的标题。.import FILE TABLE导入指定文件的数据到指定表。.indices TABLENAME显示所有索引的名字,如果指定表名,则仅仅显示匹配该表名的数据表的索引,参数TABLENAME支持LIKE表达式支持的通配符。.log FILE|off 打开或关闭日志功能,FILE可以为标准输出stdout,或标准错误输出stderr。.mode MODE TABLENAME设置输出模式,这里最为常用的模式是column模式,使SELECT输出列左对齐显示。.nullvalue STRING 使用指定的字符串代替NULL值的显示。.output FILENAME 将当前命令的所有输出重定向到指定的文件。.output stdout 将当前命令的所有输出重定向到标准输出(屏幕)。.quit 退出当前程序。 .read FILENAME 执行指定文件内的SQL语句。.restore DBNAME FILE 从指定的文件还原数据库,缺省为main数据库,此时也可以指定其它数据库名,被指定的数据库成为当前连接的attached数据库。.schema TABLENAME显示数据表的创建语句,如果指定表名,则仅仅显示匹配该表名的数据表创建语句,参数TABLENAME支持LIKE表达式支持的通配符。.separator STRING改变输出模式和.import的字段间分隔符。.show显示各种设置的当前值。.tables TABLENAME列出当前连接中main数据库的所有表名,如果指定表名,则仅仅显示匹配该表名的数据表名称,参数TABLENAME支持LIKE表达式支持的通配符。.width NUM1 NUM2 ...在MODE为column时,设置各个字段的宽度,注意:该命令的参数顺序表示字段输出的顺序。

   

    见如下常用示例:
    1). 备份和还原数据库。
    --在当前连接的main数据库中创建一个数据表,之后再通过.backup命令将main数据库备份到D:/mydb.db文件中。
    sqlite> CREATE TABLE mytable (first_col integer);
    sqlite> .backup 'D:/mydb.db'
    sqlite> .exit
    --通过在命令行窗口下执行sqlite3.exe以重新建立和SQLite的连接。
    --从备份文件D:/mydb.db中恢复数据到当前连接的main数据库中,再通过.tables命令可以看到mytable表。
    sqlite> .restore 'D:/mydb.db'
    sqlite> .tables
    mytable
    
    2). DUMP数据表的创建语句到指定文件。
    --先将命令行当前的输出重定向到D:/myoutput.txt,之后在将之前创建的mytable表的声明语句输出到该文件。
    sqlite> .output D:/myoutput.txt
    sqlite> .dump mytabl%
    sqlite> .exit
    --在DOS环境下用记事本打开目标文件。
    D:\>notepad myoutput.txt
    
    3). 显示当前连接的所有Attached数据库和main数据库。
    sqlite> ATTACH DATABASE 'D:/mydb.db'AS mydb;
    sqlite> .databases
    seq  name               file
    ---  ---------------  ------------------------
    0    main
    2    mydb                D:\mydb.db
    
    4). 显示main数据库中的所有数据表。
    sqlite> .tables
    mytable
    
    5). 显示匹配表名mytabl%的数据表的所有索引。
    sqlite> CREATE INDEX myindex on mytable(first_col);
    sqlite> .indices mytabl%
    myindex        
    
    6). 显示匹配表名mytable%的数据表的Schema信息。
    --依赖该表的索引信息也被输出。
    sqlite> .schema mytabl%
    CREATE TABLE mytable (first_col integer);
    CREATE INDEX myindex on mytable(first_col);
   
    7). 格式化显示SELECT的输出信息。
    --插入测试数据
    sqlite> INSERT INTO mytable VALUES(1);
    sqlite> INSERT INTO mytable VALUES(2);
    sqlite> INSERT INTO mytable VALUES(3);    
    --请注意没有任何设置时SELECT结果集的输出格式。
    sqlite> SELECT * FROM mytable;
    1
    2
    3    
    --显示SELECT结果集的列名。
    --以列的形式显示各个字段。
    --将其后输出的第一列显示宽度设置为10.

    sqlite> .header on
    sqlite> .mode column
    sqlite> .width 10
    sqlite> SELECT * FROM mytable;
    first_col
    ----------
    1
    2
    3



说明:本说明文档属作者从接触 SQLite 开始认识的 API 函数的使用方法, 由本人翻译, 不断更新.

复制代码
/* 2012-05-25 */int sqlite3_open(    const char* filename,    /* 数据库文件名, 必须为 UTF-8 格式 */    sqlite3** ppDB            /* 输出: SQLite 数据库句柄 */);说明:    该函数打开由 filename 指定的数据库, 一个数据库连接句柄由 *ppDB 返回(不管是否发生了一个错误). 唯一异常是 SQLite 无法为 SQLite 对象分配内存空间, 此时将返回 NULL. 如果数据库被成功打开(和/或 创建), 函数返回 SQLITE_OK(0). 否则返回一个错误码, 可以通过 sqlite3_errmsg() 取得错误原因. 无论是否成功打开数据库, 都应该使用 sqlite3_close() 关闭数据库连接.示例:    int ret = 0;    char* filename = "./nbsg.db";    sqlite3* pDB = NULL;    to_utf8(filename);    ret = sqlite3_open(filename, &pDB);    if(ret != SQLITE_OK)        ...int sqlite3_close(    sqlite3* pDB    /* 由 sqlite3_open 或基相关的函数打开的 SQLite 对象句柄 */    );说明:    该函数用来析构 sqlite3 对象. 返回 SQLITE_OK 表示对象被成功析构, 以及所有相关的资源被成功回收应用程序必须在关闭之前 "完成(finalize)" 所有的 "预编译语句(prepared statements)", 并且关闭所有的 "二进制句柄绑定(BLOB handle)", 如果在关闭时还有未完成的预编译语句或二进制句柄, 那么函数返回 SQLITE_BUSY(5).示例:    if(pDB != NULL)    {        sqlite3_close(pDB);        pDB = NULL;    }
复制代码
复制代码
/* 2012-05-26 */int sqlite3_errcode(    sqlite3* pDB    /* SQLite3 数据库句柄 */);说明:    该函数返回最近一次调用 sqlite3_ API时产生的错误码.示例:    int errcode = sqlite3_errcode(pDB);const char *sqlite3_errmsg(    sqlite3* pDB    /* SQLite3 数据库句柄 */);说明:    该函数返回与pDB数据库指针相关的错误信息, 由英语书写.    用户不必考虑内存的释放, 其由SQLite内部管理, 它也将会在下产次调用函数时被覆盖.示例:    printf("%s\n", sqlite3_errmsg(pDB));    
复制代码
复制代码
/* sqlite3_exec(), 2012-05-28 */int sqlite3_exec(    sqlite3* pDB,        /* sqlite3句柄 */    const char* sql,    /* 被执行的 SQL 语句 */    int (*callback)(void*,int,char**,char**),  /* 执行/查询回调函数 */    void* pvoid,    /* 传递给回调函数的第一个参数 */    char**errmsg    /* 错误输出信息 */);说明:    该函数用来执行若干条 SQL 语句.    该函数包裹了先前版本的 sqlite3_prepare(), sqlte3_step() 和 sqlite3_finalize() 函数, 这样, 用户就可以执行简单的代码执行多条 SQL 语句.    sqlite3_exec()接口执行多条以";"分隔的SQL语句. 如果回调函数不为 NULL, 则它对每一个行查询结果都会调用该回调函数. 如果没有回调函数被指定, sqlite3_exec() 只是简单地忽略查询结果.    当在执行该SQL语句发生错误时, 执行将发生中断, 并且后面的语句也全部被忽略. 如果 errmsg 参数不为空任何错误信息将会被写进由 sqlite3_malloc() 得到的的内存空间中, 即 errmsg 指向的内存. 为了避免内存泄漏, 应用程序应该在不需要该错误信息后立即调用 sqlite3_free() 释放该内存空间. 如果 errmsg 参数不为 NULL, 并且没有错误发生, errmsg 被设置为 NULL.    如果回调函数返回非零, sqlite3_exec() 立即中断查询, 并且不再执行后续的 SQL 语句, 也不再调用回调函数, sqlite3_exec() 将返回 SQLITE_ABORT 结束执行.示例:    sqlite3_exec(pDB, to_utf8("delete from tablename where id=123;"), NULL, NULL, NULL);    sqlite3_exec(pDB, to_utf8("create table if not exists tablename (id integer primary key,name text);"), NULL, NULL, NULL);    sqlite3_exec(pDB, to_utf8("insert into tablename (name) values ('女孩不哭');"), NULL, NULL, NULL);    if(sqlite3_exec(pDB, to_utf8("select * from tablename;"), sqlite_callback, NULL, &pszErrMsg) != SQLITE_OK)    {        ...        sqlite3_free(pszErrMsg);        pszErrMsg = NULL;    }参阅:在 sqlite3 中使用回调函数(http://www.cnblogs.com/nbsofer/archive/2012/05/29/2523807.html)
复制代码
复制代码
/* 2012-05-29, sqlite3_prepare(), sqlite3_step(), sqlite3_finalize() */int sqlite3_prepare(    sqlite3* pDB,            /* 成功打开的数据库句柄 */    const char* sql,        /* UTF8编码的 SQL 语句 */    int nbytes,                /* 参数 sql 的字节数, 包含 '\0' */    sqlite3_stmt** ppStmt,    /* 输出:预编译语句句柄 */    const char** pszTail    /* 输出:指向 sql 语句中未使用的部分 */);说明:    要执行一条 SQL 查询,其必须先被编译成字节码, 然后才能被其它函数使用.    如果 nbytes 小于零, sql 语句则以第一个 '\0'终结. 如果它非负, 则为读取的最大长度. 当  nbytes 大于 0 时, 则读取指定长度, 如果'\0'先被读到, 则以'\0'结束. 如果用户知道被传入的 sql 语句是以 '\0' 结尾的, 那么有一个更好的做法是:把nbytes的值设为该字符串的长度(包含'\0'), 这样可以避免 SQLite 复制该字符串的一份拷贝, 以提高程序的效率.    如果 pszTail 不为 NULL, 则 *pszTail 指向 sql 中第一个被传入的 SQL 语句的结尾. 该函数只编译 sql 的第一个语句, 所以 *pszTail 指向的内容则是未被编译的.    *ppStmt 指向一条可以被 sqlie3_step() 函数使用的预编译语句. 如果有错误发生, *pszStmt 的值为NULL.    调用者应该使用 sqlite3_finalize() 删掉被预编译的语句.    如果函数成功, 返回 SQLITE_OK, 否则返回一个错误码.int sqlite3_step(    sqlite3_stmt* ppStmt    /* 一条被预编译的 sql 语句 */);说明:    当一条语句被 sqlite3_prepare() 或其相关的函数预编译后, sqlite3_step() 必须被调用一次或多次来评估该预编译语句.    该函数的详细行为依赖于由 sqlite3_prepare()(或其相关的函数) 产生的是一条怎样的预编译语句.    函数将返回一个以下的结果来标识其执行结果:        SQLITE_BUSY:忙碌. 数据库引擎无法锁定数据去完成其工作. 但可以多次尝试.        SQLITE_DONE:完成. sql 语句已经被成功地执行. 在调用 sqlite_reset() 之前, 当前预编译的语句不应该被 sqlite3_step() 再次调用.        SQLITE_ROW:查询时产生了结果. 此时可以通过相关的"数据访问函数(column access functions)"来取得数据. sqlite3_step() 的再一次调用将取得下一条查询结果.        SQLITE_ERROR:发生了错误. 此时可以通过 sqlite3_errmmsg() 取得相关的错误信息. sqlite3_step() 不能被再次调用.        SQLITE_MISUSE:不正确的库的使用. 该函数使用不当.其它:    有关预编译的使用, 将在以后的函数介绍中详细说明.int sqlite3_finalize(    sqlite3_stmt* pStmt    /* 被预编译的语句 */);说明:    该函数用来删除一条被预编译的 sql 语句示例:    sqlite3_finalize(pStmt);    pStmt = NULL;

0 0