geekdoc-python-zh/docs/pythonlibrary/python-a-simple-step-by-ste...

7.4 KiB
Raw Blame History

Python:一个简单的逐步 SQLite 教程

原文:https://www.blog.pythonlibrary.org/2012/07/18/python-a-simple-step-by-step-sqlite-tutorial/

SQLite 是一个独立的、无服务器的、免配置的事务 SQL 数据库引擎。Python 在 2.5 版本中获得了 sqlite3 模块,这意味着您可以使用任何当前的 Python 创建 sqlite 数据库而无需下载任何额外的依赖项。Mozilla 为其流行的 Firefox 浏览器使用 SQLite 数据库来存储书签和其他各种信息。在本文中,您将了解以下内容:

  • 如何创建 SQLite 数据库
  • 如何向表格中插入数据
  • 如何编辑数据
  • 如何删除数据
  • 基本 SQL 查询

这篇文章在功能上类似于本月早些时候出现在这个网站上的最近的 SQLAlchemy 教程。如果你想直观地检查你的数据库,你可以使用火狐的 SQLite 管理器插件,或者如果你喜欢命令行,你可以使用 SQLite 的命令行外壳

如何创建数据库并插入一些数据

在 SQLite 中创建一个数据库确实很容易,但是这个过程需要你懂一点 SQL。下面的代码将创建一个数据库来保存音乐专辑:


import sqlite3

conn = sqlite3.connect("mydatabase.db") # or use :memory: to put it in RAM

cursor = conn.cursor()

# create a table
cursor.execute("""CREATE TABLE albums
                  (title text, artist text, release_date text, 
                   publisher text, media_type text) 
               """)

首先,我们必须导入 sqlite3 库,并创建一个到数据库的连接。你可以给它一个文件路径,文件名或者使用特殊字符串“:memory:”在内存中创建数据库。在我们的例子中,我们在磁盘上一个名为 mydatabase.db 的文件中创建了它。接下来,我们创建一个 cursor 对象,它允许您与数据库交互并添加记录等。这里我们使用 SQL 语法创建一个名为相册的表格,有 5 个文本字段:标题、艺术家、发行日期、出版商和媒体类型。SQLite 只支持五种数据类型 : null、integer、real、text 和 blob。让我们在这段代码的基础上将一些数据插入到我们的新表中


# insert some data
cursor.execute("INSERT INTO albums VALUES ('Glow', 'Andy Hunter', '7/24/2012', 'Xplore Records', 'MP3')")

# save data to database
conn.commit()

# insert multiple records using the more secure "?" method
albums = [('Exodus', 'Andy Hunter', '7/9/2002', 'Sparrow Records', 'CD'),
          ('Until We Have Faces', 'Red', '2/1/2011', 'Essential Records', 'CD'),
          ('The End is Where We Begin', 'Thousand Foot Krutch', '4/17/2012', 'TFKmusic', 'CD'),
          ('The Good Life', 'Trip Lee', '4/10/2012', 'Reach Records', 'CD')]
cursor.executemany("INSERT INTO albums VALUES (?,?,?,?,?)", albums)
conn.commit()

这里我们使用 INSERT INTO SQL 命令将一条记录插入数据库。请注意,每一项都必须用单引号括起来。当您需要插入包含单引号的字符串时,这可能会变得复杂。无论如何,要将记录保存到数据库,我们必须提交它。下一段代码展示了如何使用光标的 executemany 方法一次添加多条记录。注意我们用的是问号()而不是字符串替换(%s)来插入值。使用字符串替换是不安全的,也不应该使用,因为它会允许 SQL 注入攻击发生。问号方法要好得多,使用 SQLAlchemy 甚至更好,因为它为您完成了所有的转义,这样您就不必为将嵌入的单引号转换成 SQLite 可以接受的内容而烦恼了。

更新和删除记录

能够更新数据库记录是保持数据准确的关键。如果你不能更新,那么你的数据将很快变得过时和无用。有时您也需要从数据中删除行。我们将在本节中讨论这两个主题。首先,我们来做一个更新!


import sqlite3

conn = sqlite3.connect("mydatabase.db")
cursor = conn.cursor()

sql = """
UPDATE albums 
SET artist = 'John Doe' 
WHERE artist = 'Andy Hunter'
"""
cursor.execute(sql)
conn.commit()

这里我们使用 SQL 的 UPDATE 命令来更新相册表。您可以使用 SET 来更改一个字段因此在本例中我们将艺术家字段设置为“安迪·亨特”的任何记录中的艺术家字段更改为“John Doe”。那不是很容易吗请注意如果您不提交更改那么您的更改将不会写出到数据库中。删除命令几乎一样简单。我们去看看


import sqlite3

conn = sqlite3.connect("mydatabase.db")
cursor = conn.cursor()

sql = """
DELETE FROM albums
WHERE artist = 'John Doe'
"""
cursor.execute(sql)
conn.commit()

删除甚至比更新更容易。SQL 只有 2 行!在这种情况下,我们所要做的就是使用 WHERE 子句告诉 SQLite 从(相册)中删除哪个表删除哪些记录。因此它会在艺术家字段中查找任何包含“John Doe”的记录然后将其删除。

基本 SQLite 查询

SQLite 中的查询与其他数据库(如 MySQL 或 Postgres)中的查询非常相似。您只需使用普通的 SQL 语法来运行查询,然后让游标对象执行 SQL。这里有几个例子:


import sqlite3

conn = sqlite3.connect("mydatabase.db")
#conn.row_factory = sqlite3.Row
cursor = conn.cursor()

sql = "SELECT * FROM albums WHERE artist=?"
cursor.execute(sql, [("Red")])
print cursor.fetchall()  # or use fetchone()

print "\nHere's a listing of all the records in the table:\n"
for row in cursor.execute("SELECT rowid, * FROM albums ORDER BY artist"):
    print row

print "\nResults from a LIKE query:\n"
sql = """
SELECT * FROM albums 
WHERE title LIKE 'The%'"""
cursor.execute(sql)
print cursor.fetchall()

我们执行的第一个查询是一个 **SELECT *** 这意味着我们希望选择所有与我们传入的艺术家姓名匹配的记录在本例中是“Red”。接下来我们执行 SQL 并使用 fetchall()返回所有结果。还可以使用 fetchone()来获取第一个结果。你还会注意到有一个注释掉的部分与一个神秘的 row_factory 有关。如果您取消对该行的注释,结果将作为行对象返回,这有点像 Python 字典,让您可以像字典一样访问该行的字段。但是,不能对行对象进行项目分配。

第二个查询与第一个非常相似,但是它返回数据库中的每条记录,并按艺术家姓名以升序对结果进行排序。这也演示了我们如何对结果进行循环。最后一个查询显示了如何使用 SQL 的 LIKE 命令来搜索部分短语。在这种情况下我们在整个表格中搜索以“the”开头的标题。百分号(%)是通配符。

包扎

现在您知道了如何使用 Python 创建 SQLite 数据库。您还可以创建、更新和删除记录,以及对数据库进行查询。走出去,开始你自己的整洁的数据库和/或在评论中分享你的经验!

进一步阅读

  • sqlite3 库的官方文档
  • Zetcode 的 SQLite 教程
  • 一个简单的 SqlAlchemy 0.7 / 0.8 教程

源代码