7.4 KiB
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 数据库。您还可以创建、更新和删除记录,以及对数据库进行查询。走出去,开始你自己的整洁的数据库和/或在评论中分享你的经验!