第18章-sqlite模块

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

  • 如何创建sqlite数据库

  • 如何将数据插入表中

  • 如何编辑数据

  • 如何删除数据

  • 基本SQL查询

换句话说,而不是覆盖 sqlite3 模块,我们将介绍如何实际使用它。

如果您想直观地检查您的数据库,您可以使用用于火狐的sqlite管理器插件(只需谷歌),或者如果您喜欢命令行,您可以使用sqlite的命令行shell。

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

在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 .接下来,我们创建一个光标对象,它允许您与数据库进行交互,并添加记录等。这里我们使用SQL语法创建一个名为 唱片集 包含5个文本字段:标题、艺术家、发布日期、发布者和媒体类型。sqlite只支持5个 数据类型 :空、整数、实数、文本和blob。让我们基于这段代码,在新表中插入一些数据!

注意:如果运行create table命令并且数据库已经存在,则会收到一条错误消息。

# 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命令向数据库中插入一条记录。请注意,每个项目都必须有单引号。当需要插入包含单引号的字符串时,这可能会变得复杂。无论如何,要将记录保存到数据库,我们必须 犯罪 它。下一段代码显示如何使用光标的 刽子手 方法。注意,我们使用问号(?)而不是字符串替换(%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 更改字段,因此在本例中,我们将艺术家字段更改为 约翰·多伊 在任何记录中 WHERE “艺术家”字段设置为 副董事总经理甄达安 .这不容易吗?请注意,如果不提交更改,则不会将更改写入数据库。这个 DELETE 指挥几乎同样简单。让我们看看!

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行!在这种情况下,我们所要做的就是告诉sqlite从(相册)中删除哪个表,以及使用WHERE子句删除哪些记录。因此,它寻找任何在其艺术家领域有“约翰·杜”的记录,并将其删除。

基本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 ** 这意味着我们要选择与我们传入的艺术家姓名匹配的所有记录,在本例中是“红色”。接下来,我们执行SQL并使用 胎儿() 返回所有结果。您也可以使用 fetchone()。 获取第一个结果。你也会注意到有一个关于神秘事物的评论部分 row_factory *.如果取消对该行的注释,结果将作为类似于python字典的行对象返回,并允许您像访问字典一样访问行的字段。但是,不能对行对象执行项分配。

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

总结

现在您知道了如何使用python创建一个sqlite数据库。您还可以创建、更新和删除记录,以及对数据库运行查询。