Python3.x Sqlite使用手册
Python 2.5.x 以上版本内置了 sqlite3 库,因此我们在 Python 中可以直接使用 SQLite。
sqlite3 是 Python 标准库中用于使用 SQLite 数据库的库,提供了轻量级文本数据库的全部功能。sqlite3 库的使用包括引入依赖、连接数据库、创建游标对象、执行 SQL 语句和关闭连接5步,下面我们介绍具体的步骤实现。
1) 引入依赖
具体代码为:
```
import sqlite3
```
2) 连接数据库
使用 sqlite3 库,必须先创建一个 Connection 对象,表示与程序连接的数据库:
```
conn = sqlite3.connect('test.db')
```
3) 创建游标对象
连接数据库之后,需要从连接中获取 Cursor 游标对象:
```
cs = conn.cursor()
```
4) 执行SQL语句
调用游标对象的 execute() 方法来执行 SQL 语句。创建表时,我们需要判断 SQLite 中是否存在该表,不存在则创建。
示例如下:
```
create_tb_sql='''
create table if not exists info
(id int primary key, name text, age int);'''
cs.execute(create_tb_sql)
```
查询时,我们要先通过 execute() 方法执行查询语句,然后获取查询结果,可以调用 Cursor 类的 fetchone() 方法或 fetchall() 方法,获取查询到的第一条或者全部结果:
```
cs.execute('select name from info')
result = cs.fetchall()
```
fetchall() 返回结果集中的全部数据,结果是一个元素为元组的列表。每个元组元素是按建表的字段顺序排列。
注意,游标是有状态的,它可以记录当前已经取到结果的第几个记录,因此我们只可以遍历结果集一次。在上面的查询示例中,如果执行 fetchone() 会返回空值,这一点在测试时需要注意。
更改(包括增加、更新和删除)数据时,我们要先调用 execute() 方法更改数据库中的数据,然后调用 Connection 对象的 commit() 方法进行提交,否则操作不会被保存:
```
cs.execute('insert into info values(?,?,?)',(1,'Tom',23))
conn.commit()
```
另外,我们可以使用 executemany() 方法来执行多次插入,增加多个记录。
5) 关闭连接
当所有操作完成,我们可以调用 Connection 对象的 close() 方法,关闭数据库连接:
```
conn.close()
```
提示:
游标对象是一个实现了迭代器和生成器的对象,这个时候游标对象中还没有数据,等到执行完 fetchone() 方法或 fetchall() 方法才返回一个元组,并支持 len() 方法和 index() 方法,这是它实现迭代器的原因。
游标对象只能遍历结果集一次,即每用完一次之后记录其位置,等到下次再取的时候是从游标处再取而不是从头再来,当取完所有的数据,这个游标对象就没有使用价值了。
SQL 注入攻击
通常在执行 SQL 语句时,我们需要使用一些 Python 变量的值拼接该语句。
我们不应该使用 Python 的字符串格式化符,如%s,来拼接查询语句,因为这样可能会导致 SQL 注入攻击。我们应该在SQL语句中,使用?占位符来代替值,然后把对应的值所组成的元组作为 execute() 方法的第二个参数。
示例如下:
```
param = ('123', True)
cs.execute('''SELECT comment FROM comment_table WHERE relation_id=? AND merge_mark=?''', param)
result_list = cs.fetchall()
```
我的笔记