为了在 Python 中访问和使用一个数据库,首先需要决定使用哪种类型的数据库,并获得相关的 Python 模块。这些模块对于如何与之交互可能有不同的语法。正因为如此,Python 为这些系统提供了一个共同的规范,使程序员可以管理他们自己的数据库。这就是所谓的Python 数据库 API。Python 数据库 API 提供了一个抽象层,使代码可以在不同类型的数据库之间更容易转移。这种方法的伟大之处在于,一旦你知道如何使用一种类型的数据库与Python中的数据库进行交互,其他的数据库使用起来就几乎一样了。
Python 数据库 API
关于 Python 数据库模块和[Python 数据库 API],有一些关键点需要考虑。
- 一个数据库模块必须实现一个**connect()**函数,返回一个连接对象。
- 连接对象表示与给定数据库的连接。
connection = connect(params...)
连接对象提供了几个可以利用的方法,如commit()、rollback() 和close()。
connection = connect(params...)
connection.commit()
connection.rollback()
connection.close()
Python 数据库游标
连接对象还提供了对所谓游标的访问。游标提供了与数据库实际工作的能力,并且是插入和更新等命令的执行方式。游标对象的一些常用方法如下。
cursor.execute(params) - 执行给定的数据库操作(查询或命令)
cursor.executemany(params) - 准备一个数据库操作(查询或命令),并针对在序列中发现的所有参数序列或映射执行它
cursor.
cursor.fetchone(params) - 返回一条记录,如果没有更多的记录,则返回None。
cursor.fetchall()- 取回查询结果中的所有记录。
SQLite RDBMS
当使用Python时,一个很好的关系数据库管理系统被称为SQLite,可以开始使用。[sqlite3模块]提供了一个符合Python数据库API规范的接口。SQLite超级容易设置和使用。SQLite 不需要一个服务器来运行,它只是一个简单的文件。这使得访问和操作数据库中的数据非常快。由于SQLite是基于磁盘的,因此在使用它之前不需要安装任何SQLite驱动。SQLite也是自成一体的,这意味着它不需要外部库或操作系统的很多支持来运行。这就是为什么你会在各种不同的平台上发现SQLite,包括像手机这样的嵌入式设备,甚至游戏机。
创建一个SQLite数据库
使用Python创建一个SQLite数据库是非常容易的。首先要做的是导入 sqlite3 模块,这样我们可以访问创建数据库所需的功能。这个模块遵循我们在上面学到的 Python 数据库 API 规范。
import sqlite3
接下来要做的事情是用**connect()**函数获得一个连接对象。我们将调用我们的数据库 "carls.db",并将连接对象保存在一个叫做 "connection "的变量中。这个连接函数真正酷的地方在于,如果没有一个现有的数据库,它将为你创建数据库。下次我们运行这个函数时,connect将直接连接到已经创建的carls数据库。
connection = sqlite3.connect('cars.db')
添加表
为了在这个关系型数据库中创建一个表,我们可以使用游标对象。这是通过使用 "connection.cursor "来完成的,然后把它保存在一个也叫 "cursor "的变量中。一旦我们有了游标对象,我们就可以在数据库中执行命令和查询。首先要做的是创建一个表。我们会写 "cursor",然后写".execute "来执行命令。在这个命令中,我们使用一个[三引号的字符串]来提供SQL命令,以创建一个名为cars的表,其中有made、model和year等列。每一列的数据类型都是TEXT,除了年份是一个INT。之后,我们可以保存我们创建数据库和表的变化,然后关闭连接。为了保存变化,我们将写 "connection.commit",将这些变化提交给数据库,然后用 "connection.close "关闭连接。下面是到目前为止的全部代码,我们将其放在一个名为carls.py的文件中。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS cars
(
make TEXT,
model TEXT,
year INT
)
''')
connection.commit()
connection.close()
运行代码
当我们运行代码时,一个名为carls.db的新文件会出现在我们的PyCharm项目中。

如果我们双击这个SQLite数据库文件,在PyCharm中会打开一个新的数据库标签,我们可以看到新创建的表和相关列。爽啊!

插入到数据库中
创建了第一个表后,我们可以开始向SQLite数据库添加数据。对于第一个条目,我们将添加新的福特电动野马。要做到这一点,我们可以在游标上使用**execute()函数,并使用INSERTSQL命令来插入数据。我们将使用我们想要插入的值将这些数据插入到汽车表中。这些值是我们已经创建的品牌、型号和年份列的值。最后,我们使用.commit()和.close()**来完成插入操作。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
cursor.execute("INSERT INTO cars VALUES ('Ford', 'Mustang Mach E', 2022)")
connection.commit()
connection.close()
在PyCharm中查看数据库记录
为了查看上面的代码是否成功地将我们的新记录插入到数据库中,我们可以使用PyCharm的控制台来输入SQL命令。在控制台中,我们可以运行 "select * from cars",并注意到我们在数据库中看到了我们的新记录!


如何使用 executemany()
让我们试着在cars表中添加一堆汽车,而不是只有一辆。要做到这一点,我们首先要创建我们想插入数据库的数据。在这个例子中,我们为每辆我们想要插入的汽车创建一个包含三个值的元组。然后我们把几个元组放在一个列表中,并把这个集合存储在一个名为cool_cars的变量中。实际上,我们只需一行代码就可以插入所有这些汽车。**executemany()**函数给了我们这个选择。该语句将查看cool_cars中的每个元组,并将其值填入三个占位问号。然后,它将运行每个元组的插入。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
cool_cars = [('Tesla', 'Model 3', 2020),
('Kia', 'Niro EV', 2022),
('Porsche', 'Taycan 4S', 2021)]
cursor.executemany('INSERT INTO cars VALUES (?,?,?)', cool_cars)
connection.commit()
connection.close()
我们可以再次在PyCharm控制台检查executemany()插入是否成功,结果是成功的。现在数据库里有4行。


在execute()函数中使用SQL
与其使用PyCharm查看数据库中的记录,不如让我们看看如何直接运行SQL命令来查看数据库中的记录。在下面的代码中,我们使用SQL从数据库中选择所有记录,但是我们使用**cursor.fetchone()**函数来检索第一个结果。该代码正确地得到了数据库中的第一条记录,即福特野马Mach E。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
cursor.execute("SELECT * FROM cars")
record = cursor.fetchone()
print(record)
connection.commit()
connection.close()
('Ford', 'Mustang Mach E', 2022)
使用fetchall()函数
要查看SQL查询返回的所有记录,你可以使用fetchall()。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
cursor.execute("SELECT * FROM cars")
record = cursor.fetchall()
print(record)
connection.commit()
connection.close()
[('Ford', 'Mustang Mach E', 2022), ('Tesla', 'Model 3', 2020), ('Kia', 'Niro EV', 2022), ('Porsche', 'Taycan 4S', 2021)]
如果你愿意,你也可以在结果上循环。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
records = cursor.execute("SELECT * FROM cars")
for record in records:
print(record)
connection.commit()
connection.close()
('Ford', 'Mustang Mach E', 2022)
('Tesla', 'Model 3', 2020)
('Kia', 'Niro EV', 2022)
('Porsche', 'Taycan 4S', 2021)
使用WHERE过滤记录
为了过滤数据库查询的结果,我们可以使用WHERE子句。首先,我们要看一下代码,然后讨论为什么它的结构是这样的。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
year = (2020,)
record = cursor.execute("SELECT * FROM cars WHERE year = ?", year)
print(record.fetchone())
connection.commit()
connection.close()
('Tesla', 'Model 3', 2020)
在上面的代码中,我们有一个与SQL查询一起使用的年份变量,我们在一个元组中存储要过滤的值。现在你可能会想为什么要用一个元组?为什么不直接使用2020年的值呢?我们可以直接使用字符串操作,用适当的值来组合SQL查询,但我们没有这样做,因为这样做是非常不安全的。它使你的程序容易受到SQL注入攻击。如果你需要在你的SQL语句中使用Python变量的值,使用问号占位符,并提供一个值的元组作为execute或executemany函数的第二个参数,就像我们在这里做的那样。
如何使用fetchmany()
fetchmany()函数非常好,因为它允许你很容易地从数据库中获得特定数量的记录。在这个例子中,我们使用fetchmany()从数据库中获取了2条记录。
import sqlite3
connection = sqlite3.connect('cars.db')
cursor = connection.cursor()
records = cursor.execute("SELECT * FROM cars")
print(records.fetchmany(2))
connection.commit()
connection.close()
如何在Python中使用数据库摘要
在使用Python工作时,存在各种数据库模块来存储数据。感谢 Pep 249 (Python Database API Specification 2.0),有一个通用的标准化方法来与任何类型的数据库一起工作。在本教程中,我们看了一些使用SQLite的例子。无论使用哪种数据库,其概念都是一样的。你需要一个数据库,一个与该数据库的连接,以及一个游标对象来与数据库交互。这里列出了一些常用的游标对象方法。
- cursor.execute\: 执行一个SQL语句。该SQL语句可以是参数化的(即占位符,而不是SQL字样)。占位符可以是问号(qmark风格)和命名占位符(命名风格)。
- cursor.fetchall\: 获取查询结果的所有剩余行,返回一个列表。当没有可用的记录时,会返回一个空的列表。
- cursor.fetchone\: 获取一个查询结果集的下一条记录,返回一个单一的序列,当没有更多的数据时,返回None。
- cursor.close\: 关闭游标。
- cursor.executemany\: 针对在序列中发现的所有参数序列或映射执行一条SQL命令。
- cursor.fetchmany\: 获取查询结果的下一组记录,返回一个列表。每次调用要获取的行数由size参数指定。
