SQLite 数据库的 Python 接口
SQLite 是一个开源数据库,并且是无服务器的,不需要任何配置。整个数据库是一个单一磁盘文件,可以放置在操作系统文件系统的任何位置。SQLite 命令类似于标准 SQL。SQLite 被浏览器等应用程序广泛用于内部数据存储。它也是嵌入式设备的便捷数据存储。
标准 Python 库内置支持 SQLite 数据库连接。它包含 sqlite3 模块,该模块是由 Gerhad Haring 编写的符合 DB-API V2 的模块。它遵循 DB-API 2.0。
DB-API 是根据 PEP-249 定义的,以确保用于访问不同数据库产品的 Python 模块之间的相似性。
数据库处理过程的第一步是获取一个表示数据库的连接对象。接下来,使用连接获取一个游标对象。游标对象类似于迭代器的概念。它用于处理数据库查询返回的单个行。可以将游标视为指向一组行中某一行的指针。
游标对象有助于执行 SQL 查询,以对底层数据库执行 CRUD 操作。
Connect() 函数
sqlite3 模块中的此函数返回一个连接对象,该对象表示磁盘上现有的数据库,或者如果数据库不存在则打开一个新的数据库。
import sqlite3 conn=sqlite3.connect('mydb.sqlite3')
SQLite 支持创建内存数据库。为此目的,使用特殊名称 ':memory:'。
conn=sqlite3.connect(':memory:')
以下方法在 Connection 类中定义
cursor() 此方法返回游标对象。
cur=conn.cursor()
commit() − 此方法将事务持久地提交到磁盘。
rollback() − 此方法回滚事务以将数据库状态恢复到上次调用 commit() 的状态。此方法可确保在 SQL 事务中出现异常时的数据一致性。
try: conn.commit() except: conn.rollback()
execute() − 隐式创建游标并调用其 execute() 方法
executemany() − 此方法隐式创建游标并调用其 executemany() 方法
create_function() − 此方法创建一个用户定义函数,您可以在以后从 SQL 语句中使用该函数。
create_aggregate() − 此方法创建一个聚合函数。
iterdump() − 此方法以 SQL 文本格式创建数据库的转储。
import sqlite3 con = sqlite3.connect('mydb.sqlite3') f = dump.sql', 'w') for line in con.iterdump(): f.write('%s\n' % line)
backup() − 此方法即使在访问 SQLite 数据库时也能创建其备份。
source = sqlite3.connect('mydb.sqlite3') dest = sqlite3.connect(':memory:') source.backup(dest)
游标对象
从连接对象获得的游标有助于使用 execute() 方法对数据库执行各种 SQL 操作。例如,以下语句在当前数据库中创建一个表
cur = conn.cursor() cur.execute("CREATE TABLE guests ( ID INTEGER PRIMARY KEY, name TEXT (20) NOT NULL, address TEXT (40), city TEXT (20) );"
以下在表中插入一条记录
cur.execute('''INSERT INTO GUESTS VALUES(1,'RAJU','ABIDS', 'HYDERABAD');''')
使用 executemany() 方法执行批量添加操作
addreses=[(2,'KISHAN', 'TILAK ROAD', 'PUNE'), (3, 'LATA', 'GAANDHI NAGAR', 'AURANGABAD')] sql='INSERT INTO GUESTS VALUES (:ID, :NAME, :ADD, :CITY)' cur.executemany(sql, addreses)
SELECT 查询形成一个结果集,其中包含作为对查询的响应返回的所有记录。execute() 方法使用一个表示 SELECT 查询语句的字符串。DB-API 中有两种方法可以检索表示结果集的游标中的行。
fetchone() − 从结果集中获取下一条可用记录,形式为一个元组,其中包含获取的记录的每一列的值。
fetchall() − 以元组列表的形式获取所有剩余记录。每个元组对应一行,并包含表中每一列的值。
以下代码使用 fetchone() 方法列出 guests 表中的所有记录
sql = "SELECT * from guests;" cur = db.cursor() cur.execute(sql) while True: record=cur.fetchone() if record==None: break print (record)
以下语句演示了 fetchall() 方法的使用
sql = "SELECT * from guests;" cur = db.cursor() cur.execute(sql) set = cur.fetchall() for record in set: print (record)
SQLite 和 Python 类型
SQLite 数据类型默认情况下会映射到等效的 Python 数据类型,如下表所示
Python 类型 | SQLite 类型 |
---|---|
None | NULL |
int | INTEGER |
float | REAL |
str | TEXT |
bytes | BLOB |
异常
DB-API 定义了以下与 SQLite 数据库的 SQL 操作相关的异常:
DatabaseError | 针对与数据库相关的错误引发的异常。 |
IntegrityError | 当数据库的关系完整性受到影响时引发的异常,例如外键检查失败。它是 DatabaseError 的子类。 |
ProgrammingError | 针对编程错误引发的异常,例如表未找到或已存在、SQL 语句中的语法错误、指定的参数数量错误等。 |
OperationalError | 针对与数据库操作相关的错误引发的异常,这些错误不一定在程序员的控制之下。 |
NotSupportedError | 如果使用了数据库不支持的方法或数据库 API,则引发此异常。 |