Python 使用 sqlite3 介绍

王 茂南 2023年9月28日07:04:45
评论
4161字阅读13分52秒
摘要本博客介绍了如何在 Python 中使用 sqlite3 模块操作 SQLite 数据库。SQLite 是一个自包含的文件型 SQL 数据库,无需安装额外软件即可使用。通过使用 sqlite3 模块,我们可以连接到 SQLite 数据库,创建表格,插入数据,读取和修改数据。教程中详细介绍了创建数据库连接、添加数据、读取数据和修改数据的步骤,并提供了相应的代码示例。此外,还介绍了如何使用 with 语句进行自动资源清理,以及如何防止 SQL 注入攻击。通过学习本教程,读者可以掌握在 Python 中使用 sqlite3 模块进行数据库操作的基本技能。

简介

SQLite 是一个自包含的基于文件的 SQL 数据库SQLitePython 一起捆绑发布,可以在任何 Python 应用程序中使用,无需安装其他软件。

在本教程中,我们将介绍 Python 3 中的 sqlite3 模块。我们将创建与 SQLite 数据库的连接,向该数据库添加表,插入数据,并读取和修改表中的数据。

在本教程中,我们将主要使用一个虚构的水族馆中的鱼类清单进行操作,当鱼类被添加或从水族馆中移除时需要对其进行修改。

参考资料

 

Python SQLite 使用案例

第一步 — 创建与 SQLite 数据库的连接

当我们连接到 SQLite 数据库时,实际上是访问计算机上的一个文件中的数据。SQLite 数据库是完整的 SQL 引擎,可用于许多目的。在本教程中,我们将考虑一个虚构水族馆中鱼类清单的数据库

我们可以使用 Python 的 sqlite3 模块连接到 SQLite 数据库:

  1. import sqlite3
  2. # 第一步,创建与 SQLite 数据库的连接
  3. connection = sqlite3.connect("aquarium.db")

在上面的代码中:

  • import sqlite3 让我们的 Python 程序可以访问 sqlite3 模块。
  • sqlite3.connect() 函数返回一个 Connection 对象,我们将使用它来与存储在名为 aquarium.db 的文件中的 SQLite 数据库进行交互。
  • 如果计算机上尚未存在 aquarium.dbsqlite3.connect() 会自动创建该文件。

 

第二步 — 向 SQLite 数据库添加数据

现在,我们已经连接到 aquarium.dbSQLite 数据库,可以开始向其中插入和读取数据了。

在 SQL 数据库中,数据存储在表中。表定义了一组列,并包含了每个定义列的数据的 0 个或多个行。我们将创建一个名为 fish 的表,用于跟踪以下数据:

Python 使用 sqlite3 介绍

fish 表将跟踪水族馆中每条鱼的名称、物种和水缸编号。下面列出了两个示例鱼的行:一行是名为 Sammy 的鲨鱼(shark),一行是名为 Jamie 的乌贼(cuttlefish)。

我们可以使用第一步中创建的连接在 SQLite 中创建这个 fish 表:

  1. cursor = connection.cursor()
  2. cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)")

在上面的代码中:

  • connection.cursor() 返回一个 Cursor 对象。Cursor 对象允许我们使用 cursor.execute() 将 SQL 语句发送到 SQLite 数据库。
  • 字符串 "CREATE TABLE fish ..." 是一个 SQL 语句,用于创建一个名为 fish 的表,其中包含前面描述的三列:类型为 TEXT 的 name、类型为 TEXT 的 species 和类型为 INTEGER 的 tank_number。

现在我们已经创建了一个表,可以向其中插入数据行:

  1. cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")
  2. cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
  3. connection.commit()

我们调用 cursor.execute() 两次:

  • "INSERT INTO fish VALUES ..." 是一个 SQL 语句,允许我们向表中添加行。
  • 一次插入一个行,表示鲨鱼 Sammy 在水缸 1 中;
  • 一次插入一行,表示乌贼 Jamie 在水缸 7 中。

在下一节中,我们将使用 SQL SELECT 语句检查刚刚插入到 fish 表中的行。

 

第三步 — 从 SQLite 数据库读取数据

在第二步中,我们向一个名为 fish 的 SQLite 表中添加了两行数据。我们可以使用 SELECT SQL 语句检索这些行:

  1. rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()
  2. print(rows)

如果我们运行这段代码,将会看到如下输出:

  1. 输出
  2. [('Sammy', 'shark', 1), ('Jamie', 'cuttlefish', 7)]

如果我们想要检索 fish 表中符合特定条件的行,我们可以使用 WHERE 子句:

  1. target_fish_name = "Jamie"
  2. rows = cursor.execute(
  3.     "SELECT name, species, tank_number FROM fish WHERE name = ?",
  4.     (target_fish_name,),
  5. ).fetchall()
  6. print(rows)

如果我们运行这段代码,将会看到如下输出:

  1. 输出
  2. [('Jamie', 'cuttlefish', 7)]

与之前的示例类似,cursor.execute(<SQL 语句>).fetchall() 允许我们获取 SELECT 语句的所有结果。SELECT 语句中的 WHERE 子句根据 name 的值过滤行。

请注意,我们使用 ?target_fish_name 变量替换到 SELECT 语句中。我们预期只匹配一行,确实只返回了 Jamie 这只乌贼的行。

 

第四步 — 修改 SQLite 数据库中的数据

可以使用 UPDATEDELETESQL 语句修改 SQLite 数据库中的行。

更新数据表里的值

例如,假设 Sammy 这只鲨鱼被移动到了水缸编号为 2 的位置。我们可以更改 fish 表中 Sammy 的行以反映这个变化:

  1. new_tank_number = 2  # 更新 tank_number
  2. moved_fish_name = "Sammy"
  3. cursor.execute(
  4.     "UPDATE fish SET tank_number = ? WHERE name = ?",
  5.     (new_tank_number, moved_fish_name)
  6. )
  7. connection.commit()

我们发出一个 UPDATE 的 SQL 语句,将 Sammy 的 tank_number 更改为新值 2。UPDATE 语句中的 WHERE 子句确保仅在行具有 name = "Sammy" 的情况下才更改 tank_number 的值。

此时如果我们运行以下 SELECT 语句,可以确认我们的更新操作已经正确执行:

  1. rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()
  2. print(rows)

如果我们运行这段代码,将会看到如下输出:

  1. 输出
  2. [('Sammy', 'shark', 2), ('Jamie', 'cuttlefish', 7)]

可以看到此时 Sammy 的行现在 tank_number 列的值为 2。

 

删除数据表中的行

假设 Sammy 这只鲨鱼已经被放生到野外,不再由水族馆保管。由于 Sammy 不再在水族馆中,从 fish 表中删除 Sammy 的行是合理的。

我们发出 DELETE 这个 SQL 语句以删除一行:

  1. released_fish_name = "Sammy"
  2. cursor.execute(
  3.     "DELETE FROM fish WHERE name = ?",
  4.     (released_fish_name,)
  5. )
  6. connection.commit()

我们发出一个 DELETE SQL 语句,以删除鲨鱼 Sammy 的行。DELETE 语句中的 WHERE 子句确保仅在行具有 name = "Sammy" 的情况下才删除该行。

如果我们运行以下 SELECT 语句,可以确认我们的删除操作已经正确执行:

  1. rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()
  2. print(rows)

如果我们运行这段代码,将会看到如下输出:

  1. 输出
  2. [('Jamie', 'cuttlefish', 7)]

 

第五步 — 使用 with 语句进行自动清理

在本教程中,我们使用了两个主要对象来与 aquarium.db 的 SQLite 数据库进行交互:一个名为 connectionConnection 对象和一个名为 cursorCursor 对象。

Python 文件在完成工作后应关闭一样,当不再需要 ConnectionCursor 对象时,也应该将它们关闭。我们可以使用 with 语句来帮助我们自动关闭 ConnectionCursor 对象

  1. from contextlib import closing
  2. with closing(sqlite3.connect("aquarium.db")) as connection:
  3.     with closing(connection.cursor()) as cursor:
  4.         rows = cursor.execute("SELECT 1").fetchall()
  5.         print(rows)

closingcontextlib 模块提供的一个便利函数。当一个 with 语句退出时,closing 确保在其参数上调用 close()

在此示例中,closing 函数被使用两次。

  • 一次用于确保由 sqlite3.connect() 返回的 Connection 对象自动关闭;
  • 另一次用于确保由 connection.cursor() 返回的 Cursor 对象自动关闭。

 

总结

sqlite3 模块是 Python 标准库中功能强大的一部分;它使我们能够在磁盘上使用一个完整的 SQL 数据库,而无需安装任何其他软件。

在本教程中,我们学习了如何使用 sqlite3 模块连接到 SQLite 数据库,向数据库中添加数据,并读取和修改数据库中的数据。在此过程中,我们还了解了如何使用 contextlib.closing 在 with 语句中自动调用 Python 对象的 close() 方法。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2023年9月28日07:04:45
  • 转载请务必保留本文链接:https://mathpretty.com/16311.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: