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,则引发此异常。

更新于: 2019年7月30日

291 次浏览

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告