如何在 Python 中使用 SQLite 管理数据

SQLite 是一个小型、快速、功能齐全的关系数据库引擎,它是世界上使用最多的关系数据库系统,它以 Python SQLite 的形式随 Python 一起提供。你不需要数据库服务器或与远程数据库的连接即可使用 SQLite。SQLite 使用一个简单的文件来存储数据,或者你可以将整个数据库保存在内存中。

SQLite 与 Python 捆绑在一起,你无需安装第三方模块即可为 Python 程序添加数据库功能,只需使用内置的数据库引擎即可。在本文中,我们将介绍 Python SQLite3 模块,并向你展示如何使用 Python 在 SQLite 数据库中创建、连接和操作数据。

如何在 Python 中使用 SQLite 管理数据

SQLite 数据类型

SQLite 使用关系数据库结构。这意味着你将使用SQL添加、更新和访问数据库中的数据。数据存储在由列组成的表中,并且这些列中的数据必须是一致的类型。以下是 SQLite 支持的数据类型:

  • NULL:一个 NULL 值
  • INTEGER:一个整数值
  • REAL:浮点(十进制)值
  • TEXT:文本值
  • BLOB:大型二进制对象

如果你熟悉其他关系数据库,那么你可能会注意到 SQLite 中的数据类型是有限的。例如,没有 date 或 varchar 类型。这可能意味着 SQLite 无法满足某些数据库需求,但它对许多应用程序仍然有用。

Python SQLite 入门

虽然 SQLite 内置在 Python 中,但你必须将 sqlite3 模块导入到 Python 文件中,才可以正常使用。你可以这样做:

import sqlite3

创建并连接到 SQLite 数据库

使用 Python SQLite,创建和连接数据库是一回事。如果数据库文件存在,Python 将连接到它。如果它不存在,那么它将创建数据库文件并连接到它。这是一个例子:

# 导入 sqlite3 模块
import sqlite3

# 创建数据库并使用 connect 函数连接它
# conn 变量将用于与数据库交互
conn = sqlite3.connect('db.sqlite3')

如果你运行上面的代码,它将在你运行它的文件夹中创建一个数据库文件。如果你的数据库不在同一个文件夹中,你还可以使用文件的完整路径连接到 SQLite 数据库,如下所示:

conn = sqlite3.connect('/some/other/folder/db.sqlite3')

我们将此连接对象设置为变量 conn,我们将在其余步骤中使用该变量。如果不需要静态数据库文件,也可以创建和使用只存在于内存中的SQL数据库,一旦程序停止就会消失。以下是创建和连接到内存中 SQLite 数据库的方法:

conn = sqlite3.connect(":memory:")

使用 Python SQLite 创建游标对象

完成创建连接对象后,你现在需要创建一个游标对象以使用 SQL 查询数据库。这是完整的脚本:

# 导入 sqlite3 模块
import sqlite3
# 创建连接
conn = sqlite3.connect('db.sqlite3')
# 创建游标
cursor = conn.cursor()

现在我们有了一个游标对象,我们可以使用该对象的 execute 方法在数据库上执行 SQL。确保将 SQL 查询用引号括起来。你可以使用单引号或双引号。

cursor.execute("SELECT * FROM my_table;")

在 SQLite 数据库中创建表

现在我们有了一个游标对象并且可以执行 SQL,我们可以创建表来保存我们的数据。对于此示例,我们将创建两个表,以便稍后在 SQL 查询中使用JOIN 。以下是使用 Python SQLite 创建表的方法:

# 创建用户表
cursor.execute('''CREATE TABLE IF NOT EXISTS users(
 id INTEGER PRIMARY KEY,
 firstname TEXT,
 lastname TEXT);
''')
conn.commit()
# 创建笔记表
cursor.execute('''CREATE TABLE IF NOT EXISTS notes(
 id INTEGER PRIMARY KEY,
 userid INTEGER,
 note TEXT);
''')
conn.commit()

关于上面的代码,你应该注意以下几点:

  • 我们使用三引号将 SQL 查询括起来,因为 Python 中的三引号允许你创建跨越多行的字符串变量。这使你可以根据需要格式化 SQL。
  • SQL 查询的 IF NOT EXISTS部分让我们在创建表之前检查表是否存在。如果表已经存在,则不会发生任何事情,脚本将进入下一步。
  • 我们使用游标方法 execute() 来运行 SQL 查询。
  • 我们使用连接对象的commit方法将这个事务提交到数据库。在调用 commit 之前,更改不会显示在数据库中,但你也可以在调用 commit 之前执行多个查询,最后只调用一次。如果你不希望在任何一个查询中发生错误时保存任何更改,这将非常有用。如果出现错误,你可以调用 conn.rollback(),它将所有更改回滚到最后一次提交。
  • 我们在每个表上设置一个 id 列,作为表的主键。如果我们添加 AUTOINCREMENT 关键字,SQLite 还可以自动增加 ID,但它会影响性能,如果不需要,则不应使用。我们将手动设置这些 ID。
  • 因为当我们将列定义为 INTEGER PRIMARY KEY 时,SQLite 不允许空值,所以我们在创建记录时总是需要设置它,否则会抛出错误。
  • 我们在 notes 表中添加了一个 userid 列来引用与特定笔记相关的用户。

将数据添加到 SQLite 表

现在我们有一些表可以使用,我们可以将数据添加到表中。我们将继续使用游标对象的execute方法来执行SQL查询和连接对象的commit方法来提交对数据库的更改。如果我们只是想添加一个有一个注释的用户,我们可以使用如下代码:

# 添加单个用户
cursor.execute('''INSERT INTO users(id, firstname, lastname)
 VALUES(1, 'John', 'Doe');
''')
conn.commit()

# 添加单个笔记
cursor.execute('''INSERT INTO notes(id, userid, note)
 VALUES(1, 1, 'This is a note');
 ''')
conn.commit()

如果我们想一次添加多条记录,这是一种更简单的方法:

# 多个用户
all_users = [(2, 'Bob', 'Doe'), (3, 'Jane', 'Doe'), (4, 'Jack', 'Doe')];
# 添加多个用户
cursor.executemany('''INSERT INTO users(id, firstname, lastname)
 VALUES(?, ?, ?);''', all_users)
conn.commit()

# 多个笔记
bobs_notes = [(2, 2, '这是第二个笔记'), (3, 2, '这是第三个笔记')];
janes_notes = [(4, 3, '这是第四个笔记'), (5, 3, '这是第五个笔记')];
jacks_notes = [(6, 4, '这是第六个笔记'), (7, 4, '这是第七个笔记')];
all_notes = bobs_notes + janes_notes + jacks_notes;
# 添加多个笔记
cursor.executemany('''INSERT INTO notes(id, userid, note)
 VALUES(?, ?, ?);''', all_notes)
conn.commit()

以下是你需要了解的有关上述代码的信息:

  • executemany() 方法接受两个参数:一个带有占位符的 SQL 查询,其中将插入值,以及一个包含要插入的记录的元组列表。
  • 为了创建每个人的笔记的单个列表,我们使用 + 运算符连接笔记列表。
  • 这种运行 SQL 查询的方法可以避免 SQL 注入攻击。

还需要注意的是,你可以使用类似的方法通过 execute() 方法添加记录,但它一次只会插入一条记录。这是一个例子:

# 添加单个用户
user = (1, 'John', 'Doe')
cursor.execute('''INSERT INTO users(id, firstname, lastname)
 VALUES(?, ?, ?);
''', user)
conn.commit()

从现在开始,我们将使用这种执行查询的方法,因为这是防止 SQL 注入的好习惯。


优质课程推荐

如何在 Python 中使用 SQLite 管理数据

【Udemy课程 + 中英文字幕】

SQL – 完整的开发人员指南(MySQLPostgreSQL

从 SQLite 读取数据

你可以使用 Python SQLite 以几种不同的方式获取数据。

使用 fetchall()

fetchall() 方法将 SQL 查询产生的每条记录作为元组列表返回。这是一个查询所有用户的示例:

# 获取所有用户
users = cursor.execute('''SELECT * FROM users''').fetchall()
print(users)

以下是这段代码的结果:

[( 1 , 'John', 'Doe'), ( 2 , 'Bob', 'Doe'), ( 3 , 'Jane', 'Doe'), ( 4 , 'Jack', 'Doe')]

我们还可以使用WHERE子句限制 SQL 查询,以仅获取 Jack 笔记的文本并返回所有这些记录。

# 获取杰克的笔记
jacks_notes = cursor.execute('''SELECT note FROM notes WHERE userid = ?''', (4,)).fetchall()
print(jacks_notes)

这是执行此代码的结果:

[('这是第六个笔记',), ('这是第七个笔记',)]

使用 fetchmany()

fetchmany() 方法类似于 fetchall() 方法,但接受一个整数参数,该参数指定要获取的记录数。这是相同的用户查询,我们只获取从该 SQL 语句返回的前两条用户记录:

# 获取前两个用户
users = cursor.execute('''SELECT * FROM users''').fetchmany(2)
print(users)

以下是此代码返回的记录:

[( 1 , 'John', 'Doe'), ( 2 , 'Bob', 'Doe')]

使用 fetchone()

Python SQLite fetching() 方法类似于在 Microsoft SQL Server 中使用 SELECT TOP 1 并将返回查询的第一条记录。这是一个例子:

# 获取一个用户
user = cursor.execute('''SELECT * FROM users''').fetchone()
print(user)

这是此脚本打印的内容:

(1 , '约翰', 'Doe')

另请注意,当你使用 fetchone() 时,你会得到一个元组,而不是一个元组的列表。

连接表

你不必拘泥于 SQLite 中的简单 SQL 查询。毕竟,关系数据库的重点是将不同的数据集相互关联。我们创建了一个 users 表,然后使用 notes 表中的 userid 引用每个用户,以便将便笺与拥有它们的用户相关联。现在是时候让这种关系发挥作用了。假设我们想要 notes 表中的每个便笺以及拥有该便笺的用户的名字和姓氏。以下是我们如何从数据库中检索该数据:

# 获取note中的用户名
notes = cursor.execute('''
 SELECT u.firstname, u.lastname, n.note FROM users AS u
 INNER JOIN notes AS n
 ON u.id = n.userid''').fetchall()
print(notes)

请注意,我们在查询中使用了 AS 关键字。这为 SQLite 中的表名称设置了一个别名,因此我们不必在使用它的任何地方输入整个名称。这是此查询的结果:

[('John', 'Doe', 'This is a note'), ('Bob', 'Doe', 'This is a second note'), ('Bob', 'Doe', 'This is a third note'), ('Jane', 'Doe', 'This is a Fourth note'), ('Jane', 'Doe', 'This is a Fifth note'), ('Jack', 'Doe', '这是第七个笔记')]

更新 SQLite 数据库中的数据

你还可以通过在 SQL 查询中使用更新语句来更新SQLite 数据库中的数据。在此示例中,Jack 想要更改他的一个笔记的内容:

# 更新 Jack 的笔记
updated_note = 'This is an updated note'
note_id = 6
cursor.execute('''UPDATE notes SET note = ? WHERE id = ?;''', (updated_note, note_id))
conn.commit()

如果我们查看数据库,我们可以看到注释已更新。

使用 Python SQLite 删除数据

要删除数据库中的数据,过程是相同的。只需将删除语句添加到你的 SQL 查询、执行查询并提交更改。这是一个例子:

# 删除 Jack 的一条笔记
note_id = 6
cursor.execute('''DELETE FROM notes WHERE id = ?;''', (note_id, ))
conn.commit()

当我们查看数据库时,id 为 6 的便笺将消失。

关闭数据库连接

你可能已经注意到,我们在代码中一遍又一遍地处理了两个 Python SQLite 对象:一个连接和一个游标。当我们不再需要它们时关闭这些对象是一种很好的做法,这是一种使用 with 语句和 Python contextlib 中的关闭方法自动完成的简单方法:

from contextlib import closing
with closing(sqlite3.connect('db.sqlite3')) as conn:
    with closing(conn.cursor()) as cursor:
    # 这里是我们执行所有查询的地方
    users = cursor.execute(' SELECT * from users').fetchall()
    print(users)   
    # 一旦我们退出 with 块,游标和连接都将被关闭

SQLite 模块内置于 Python 中,是一种强大的方式来操作、存储和检索 Python 应用程序的数据。要了解有关 Python 及其功能的更多信息,请阅读Python 是什么。口袋资源(koudaizy.com) 提供非常多的Python 课程SQL课程,可让你按照自己的进度下载学习。

如果本站的内容对你有帮助,可以点击这儿,不花一分钱捐赠本站

(1)
疯狂的小黑的头像疯狂的小黑
上一篇 2022年7月12日 下午6:06
下一篇 2022年7月15日 上午11:20

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

微信