Sqlite学习笔记(11)-API(2)

2.2.3 执行Prepared Query
前面提到,预处理查询(Prepared Query)是SQLite执行所有SQL命令的方式,包括以下三个过程:
(1)Preparation
分析器(parser),分词器(tokenizer)和代码生成器(code generator)把SQL Statement编译成VDBE字节码,编译器会创建一个statement句柄(sqlite3_stmt),它包括字节码以及其它执行命令和遍历结果集的所有资源。
相应的C API为sqlite3_prepare_v2(),位于prepare.c文件中,如下:

int sqlite3_prepare_v2(
  sqlite3 *db,              /* Database handle. */
  const char *zSql,         /* UTF-8 encoded SQL statement. */
  int nBytes,               /* Length of zSql in bytes. */
  sqlite3_stmt **ppStmt,    /* OUT: A pointer to the prepared statement */
  const char **pzTail       /* OUT: End of parsed string */
){
  int rc;
  rc = sqlite3LockAndPrepare(db,zSql,nBytes,1,0,ppStmt,pzTail);
  assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 );  /* VERIFY: F13021 */
  return rc;
}

(2) Execution
VDBE执行字节码,执行过程是一个步进(stepwise)的过程,每一步(step)由sqlite3_step()启动,并由VDBE执行一段字节码。在遍历结果集的过程中,它返回SQLITE_ROW,当到达结果末尾时,返回SQLITE_DONE。
相应的C API为sqlite3_step(),位于Vdbeapi.c文件中,如下:

int sqlite3_step(sqlite3_stmt *pStmt){
  int rc = SQLITE_OK;      /* Result from sqlite3Step() */
  int rc2 = SQLITE_OK;     /* Result from sqlite3Reprepare() */
  Vdbe *v = (Vdbe*)pStmt;  /* the prepared statement */
  int cnt = 0;             /* Counter to prevent infinite loop of reprepares */
  sqlite3 *db;             /* The database connection */

  if( vdbeSafetyNotNull(v) ){
    return SQLITE_MISUSE_BKPT;
  }
  db = v->db;
  sqlite3_mutex_enter(db->mutex);
  v->doingRerun = 0;
  while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
         && cnt++ < SQLITE_MAX_SCHEMA_RETRY ){
    int savedPc = v->pc;
    rc2 = rc = sqlite3Reprepare(v);
    if( rc!=SQLITE_OK) break;
    sqlite3_reset(pStmt);
    if( savedPc>=0 ) v->doingRerun = 1;
    assert( v->expired==0 );
  }
  if( rc2!=SQLITE_OK ){
    const char *zErr = (const char *)sqlite3_value_text(db->pErr); 
    sqlite3DbFree(db, v->zErrMsg);
    if( !db->mallocFailed ){
      v->zErrMsg = sqlite3DbStrDup(db, zErr);
      v->rc = rc2;
    } else {
      v->zErrMsg = 0;
      v->rc = rc = SQLITE_NOMEM;
    }
  }
  rc = sqlite3ApiExit(db, rc);
  sqlite3_mutex_leave(db->mutex);
  return rc;
}

(3)Finalization
VDBE关闭statement,释放资源。
相应的C API为sqlite3_finalize(),位于Vdbeapi.c文件中,如下:

int sqlite3_finalize(sqlite3_stmt *pStmt){
  int rc;
  if( pStmt==0 ){ 
    rc = SQLITE_OK;
  }else{
    Vdbe *v = (Vdbe*)pStmt;
    sqlite3 *db = v->db;
    if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT;
    sqlite3_mutex_enter(db->mutex);
    checkProfileCallback(db, v);
    rc = sqlite3VdbeFinalize(v);
    rc = sqlite3ApiExit(db, rc);
    sqlite3LeaveMutexAndCloseZombie(db);
  }
  return rc;
}

这三步-preparation, execution, finalization-分别代表不同的statement句柄状态- prepared, active, or finalized。图2.3显示了这些步骤和状态。
下边我们可以用一段伪代码展示一下执行过程,代码如下:

# 1. Open the database, create a connection object (db)
db = open('foods.db')
# 2.A. Prepare a statement
stmt = db.prepare('select * from episodes')
# 2.B. Execute. Call step() is until cursor reaches end of result set.
while stmt.step() == SQLITE_ROW
print stmt.column('name')
end
# 2.C. Finalize. Release read lock.
stmt.finalize()
# 3. Insert a record
stmt = db.prepare('INSERT INTO foods VALUES (…)')
stmt.step()
stmt.finalize()
# 4. Close database connection.
db.close()

这里写图片描述

图2.3 语句执行过程
2.2.4 执行Wrapped Query
前边已经提到过,wrapped query只是对prepared query的三个过程封装而已。Wrapped query包括二个函数,sqlite3_exec()以及sqlite3_get_table()。这两个函数都可用于查询,不过sqlite3_exec()主要用于不返回数据的查询,而sqlite3_get_table()则相反。其中sqlite3_exec()位于Legacy.c,而sqlite3_get_table()位于table.c。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python学习笔记完整的话题很广泛,这里只能提供一个简单的概述。Python是一种高级编程语言,易于学习和使用,它在各个领域都有广泛的应用。以下是一些学习Python的关键点: 1. 安装Python:首先,你需要安装Python解释器。你可以从官方网站(https://www.python.org)下载适合你操作系统的版本,并按照官方指南进行安装。 2. 语法基础:学习Python的第一步是了解其基本语法。掌握变量、数据类型、运算符、条件语句、循环结构等基本概念。你可以通过阅读教程或参考Python官方文档来学习。 3. 数据结构:了解Python中常用的数据结构,如列表、元组、集合和字典。这些数据结构对于存储和操作数据非常重要。 4. 函数和模块:学习如何定义和调用函数,以及如何将代码组织成模块。了解如何使用Python标准库中的模块来扩展功能。 5. 文件操作:学习如何读写文件,并了解文件处理的常用技巧。这对于处理文本文件、CSV文件和JSON文件等非常有用。 6. 异常处理:了解如何使用异常处理机制来捕获和处理错误。这有助于编写更健壮和可靠的代码。 7. 面向对象编程:学习如何使用面向对象编程(OOP)的概念和技术。掌握类、对象、继承和多态等概念。 8. 数据库操作:了解如何使用Python连接和操作数据库。学习SQL语言和Python数据库API(如SQLite、MySQL或PostgreSQL)。 9. Web开发:学习使用Python开发Web应用程序。了解基本的Web开发框架(如Django或Flask)和前端技术(如HTML、CSS和JavaScript)。 10. 数据分析和机器学习学习如何使用Python进行数据分析和机器学习。掌握常用的数据分析库(如NumPy和Pandas)和机器学习库(如Scikit-learn)。 以上只是Python学习的一些基本方面,你可以根据自己的兴趣和目标进一步深入学习和实践。记住,不断练习和实践是提高编程能力的关键!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值