使用 PyQt 处理 SQL 数据库:基础知识

2023-12-03

构建使用SQL数据库是一个相当常见的编程任务。 SQL 数据库无处不在,并且在 Python 中得到了很好的支持。在 GUI 编程中,PyQt 提供了健壮且跨平台的功能SQL数据库支持它允许您一致地创建、连接和管理数据库。

PyQt 的 SQL 支持与其完全集成模型-视图架构帮助您构建数据库应用程序。

在本教程中,您将学习如何:

  • 使用 PyQtSQL支持可靠地连接到数据库
  • 执行SQL查询使用 PyQt 在数据库上
  • 使用 PyQt模型-视图架构在数据库应用中
  • 使用不同的 PyQt 显示和编辑数据小部件

本教程中的示例需要 SQL 语言的基本知识,尤其是SQLite数据库管理系统。之前的一些知识使用 Python 和 PyQt 进行 GUI 编程也会有帮助的。

免费奖金: 关于掌握 Python 的 5 个想法,为 Python 开发人员提供的免费课程,向您展示将 Python 技能提升到新水平所需的路线图和思维方式。

将 PyQt 连接到 SQL 数据库

将应用程序连接到关系型数据库让应用程序创建、读取、更新和删除存储在数据库中的数据是编程中的常见任务。关系数据库通常被组织成一组桌子, 或者关系。给定的row在表中被称为记录或者元组,和一个柱子被称为属性.

笔记:期限场地常用的识别存储在表中给定记录的单元格中的单条数据。另一方面,术语字段名称用于标识列的名称。

每列存储特定类型的信息,例如名称、日期或数字。每行代表一组密切相关的数据,并且每行具有相同的一般结构。例如,在存储有关公司员工的数据的数据库中,特定行代表单个员工。

大多数关系数据库系统使用SQL(结构化查询语言)用于查询、操作和维护数据库中保存的数据。 SQL 是一个陈述性的特定领域的专门为与数据库通信而设计的编程语言。

关系数据库系统和SQL如今被广泛使用。您会发现几种不同的数据库管理系统,例如SQLite, PostgreSQL, MySQL, 玛丽亚数据库,以及许多其他人。您可以使用专用的 Python SQL 库将 Python 连接到任何这些数据库系统。

笔记:尽管 PyQt 的内置 SQL 支持是在 PyQt 中管理 SQL 数据库的首选选项,但您也可以使用任何其他库来处理数据库连接。其中一些库包括SQL炼金术, 熊猫, SQLite, 等等。

但是,使用不同的库来管理数据库有一些缺点。您将无法利用 PyQt 的 SQL 类和模型视图架构之间的集成。此外,您还将向应用程序添加额外的依赖项。

当涉及到使用 Python 和 PyQt 进行 GUI 编程时,PyQt 提供了强大的功能用于处理 SQL 数据库的类集。当您需要将应用程序连接到 SQL 数据库时,这组类将是您最好的盟友。

笔记:很遗憾,PyQt5的官方文档有一些不完整的部分。要解决此问题,您可以查看PyQt4 文档, 这Qt For Python 的文档,或者原来的Qt 文档。在本教程中,一些链接会将您带到原始的 Qt 文档,在大多数情况下这是更好的信息来源。

在本教程中,您将学习如何使用 PyQt 的 SQL 支持来创建与关系数据库可靠交互以读取、写入、删除和显示数据的 GUI 应用程序的基础知识。

创建数据库连接

将应用程序连接到物理 SQL 数据库是使用 PyQt 开发数据库应用程序过程中的重要一步。要成功执行此步骤,您需要一些有关如何设置数据库的一般信息。

例如,您需要知道您的数据库是基于什么数据库管理系统构建的,并且您可能还需要用户名、密码、主机名等。

在本教程中,您将使用SQLite 3,这是一个经过充分测试的数据库系统,支持所有平台且配置要求最低。 SQLite 允许您直接读取和写入本地磁盘中的数据库,而不需要单独的服务器进程。这使其成为学习数据库应用程序开发的用户友好选项。

使用 SQLite 的另一个优点是该库随 Python 和 PyQt 一起提供,因此您无需安装任何其他内容即可开始使用它。

在 PyQt 中,您可以使用以下命令创建数据库连接QSql数据库班级。该类代表一个连接并提供访问数据库的接口。要创建连接,只需调用.addDatabase()QSqlDatabase。这静态方法需要一个SQL驱动程序和一个可选的连接名称作为参数和回报数据库连接:

QSqlDatabase.addDatabase(
    driver, connectionName=QSqlDatabase.defaultConnection
)

第一个论点,driver, 是一个必需的参数,包含细绳包含一个名字PyQt 支持的 SQL 驱动程序。第二个论点,connectionName, 是一个可选参数,它包含带有连接名称的字符串。connectionName默认为QSqlDatabase.defaultConnection,通常保存字符串"qt_sql_default_connection".

如果您已经有一个名为connectionName,然后该连接被删除并替换为新连接,并且.addDatabase()将新添加的数据库连接返回给调用者。

致电.addDatabase()将数据库连接添加到可用连接列表中。这份清单是一个全球登记处PyQt 在幕后维护以跟踪应用程序中的可用连接。用有意义的方式注册您的联系connectionName会让你管理多个连接在数据库应用程序中。

创建连接后,您可能需要设置多个连接属性在上面。具体的属性集取决于您使用的驱动程序。一般来说,您需要设置数据库名称、用户名和访问数据库的密码等属性。

以下是可用于设置数据库连接的更常用属性或特性的 setter 方法的摘要:

Method Description
.setDatabaseName(name) Sets the database name to name, which is a string representing a valid database name
.setHostName(host) Sets the hostname to host, which is a string representing a valid hostname
.setUserName(username) Sets the username to username, which is a string representing a valid user name
.setPassword(password) Sets the password to password, which is a string representing a valid password

请注意,您作为参数传递给的密码.setPassword()以纯文本形式存储,稍后可以通过调用检索.password()。这是一个严重的安全风险您应该避免在数据库应用程序中引入它。您将在本节中学习更安全的方法打开数据库连接在本教程的后面部分。

使用以下命令创建与 SQLite 数据库的连接QSqlDatabase,打开一个Python 交互式会话并输入以下代码:

>>>
>>> from PyQt5.QtSql import QSqlDatabase

>>> con = QSqlDatabase.addDatabase("QSQLITE")
>>> con.setDatabaseName("contacts.sqlite")

>>> con
<PyQt5.QtSql.QSqlDatabase object at 0x7f0facec0c10>

>>> con.databaseName()
'contacts.sqlite'

>>> con.connectionName()
'qt_sql_default_connection'

此代码将使用创建一个数据库连接对象"QSQLITE"作为连接的驱动程序和"contacts.sqlite"作为连接的数据库名称。由于您没有将连接名称传递给.addDatabase(),新创建的连接将成为您的默认连接,其名称为"qt_sql_default_connection".

对于 SQLite 数据库,数据库名称通常是文件名或包含数据库文件名的路径。您也可以使用特殊名称":memory:"对于内存数据库。

处理多个连接

在某些情况下,您可能需要使用与单个数据库的多个连接。例如,您可能希望使用每个用户的特定连接来记录用户与数据库的交互。

在其他情况下,您可能需要将应用程序连接到多个数据库。例如,您可能想要连接到多个远程数据库以收集数据来填充或更新本地数据库。

为了处理这些情况,您可以为不同的连接提供特定的名称,并按名称引用每个连接。如果您想为数据库连接指定一个名称,则将该名称作为第二个参数传递给.addDatabase():

>>>
>>> from PyQt5.QtSql import QSqlDatabase

>>> # First connection
>>> con1 = QSqlDatabase.addDatabase("QSQLITE", "con1")
>>> con1.setDatabaseName("contacts.sqlite")

>>> # Second connection
>>> con2 = QSqlDatabase.addDatabase("QSQLITE", "con2")
>>> con2.setDatabaseName("contacts.sqlite")

>>> con1
<PyQt5.QtSql.QSqlDatabase object at 0x7f367f5fbf90>
>>> con2
<PyQt5.QtSql.QSqlDatabase object at 0x7f3686dd7510>

>>> con1.databaseName()
'contacts.sqlite'
>>> con2.databaseName()
'contacts.sqlite'

>>> con1.connectionName()
'con1'
>>> con2.connectionName()
'con2'

在这里,您创建到同一数据库的两个不同连接,contacts.sqlite。每个连接都有自己的连接名称。您可以根据需要随时在代码中使用连接名称来获取对特定连接的引用。为此,您可以致电.database()带有连接名称:

>>>
>>> from PyQt5.QtSql import QSqlDatabase

>>> db = QSqlDatabase.database("con1", open=False)

>>> db.databaseName()
'contacts.sqlite'
>>> db.connectionName()
'con1'

在此示例中,您会看到.database()有两个参数:

  1. connectionName保存您需要使用的连接名称。如果您不传递连接名称,则将使用默认连接。
  2. open持有一个布尔值告诉我们的值.database()是否要自动打开连接。如果openTrue(默认)并且连接未打开,则连接会自动打开。

返回值.database()是对名为的连接对象的引用connectionName。您可以使用不同的连接名称来获取对特定连接对象的引用,然后使用它们来管理数据库。

使用不同的 SQL Divers

到目前为止,您已经学习了如何使用创建数据库连接SQLite驱动程序。这不是 PyQt 中唯一可用的驱动程序。该库提供了一组丰富的 SQL 驱动程序,允许您根据您的具体需求使用不同类型的数据库管理系统:

Driver Name Database Management System
QDB2 IBM Db2 (version 7.1 and above)
QIBASE Borland InterBase
QMYSQL/MARIADB MySQL or MariaDB (version 5.0 and above)
QOCI Oracle Call Interface
QODBC Open Database Connectivity (ODBC)
QPSQL PostgreSQL (versions 7.3 and above)
QSQLITE2 SQLite 2 (obsolete since Qt 5.14)
QSQLITE SQLite 3
QTDS Sybase Adaptive Server (obsolete since Qt 4.7)

驱动程序名称列包含标识符字符串你需要传递给.addDatabase()作为使用关联驱动程序的第一个参数。与 SQLite 驱动程序不同,当您使用不同的驱动程序时,您可能需要设置多个属性,例如数据库名称, 主机名 , 用户名, 和密码,以使连接正常工作。

数据库驱动程序源自QSql驱动程序。您可以通过子类化来创建自己的数据库驱动程序QSqlDriver,但该主题超出了本教程的范围。如果您有兴趣创建自己的数据库驱动程序,请查看如何编写自己的数据库驱动程序更多细节。

打开数据库连接

建立数据库连接后,您需要打开该连接才能与数据库进行交互。为此,您可以致电。打开()在连接对象上。.open()有以下两种变体:

  1. .open()使用当前连接值打开数据库连接。
  2. .open(username, password)使用提供的打开数据库连接usernamepassword.

两种变体均返回True如果连接成功。否则,他们会返回False。如果无法建立连接,您可以拨打.lastError()获取有关所发生事件的信息。此函数返回有关数据库报告的最后一个错误的信息。

笔记:正如您之前了解到的,.setPassword(password)将密码存储为纯文本,这存在安全风险。另一方面,.open()根本不存储密码。打开连接时,它将密码直接传递给驱动程序。之后,它会丢弃密码。所以,使用.open()如果您想防止安全问题,管理密码是最佳选择。

下面是如何使用第一个变体打开 SQLite 数据库连接的示例.open():

>>>
>>> from PyQt5.QtSql import QSqlDatabase

>>> # Create the connection
>>> con = QSqlDatabase.addDatabase("QSQLITE")
>>> con.setDatabaseName("contacts.sqlite")

>>> # Open the connection
>>> con.open()
True
>>> con.isOpen()
True

在上面的示例中,您首先创建到 SQLite 数据库的连接并使用以下命令打开该连接.open()。自从.open()回报True,连接成功。此时,您可以使用以下命令检查连接.isOpen(),返回True如果连接打开并且False否则。

笔记:如果你打电话.open()在使用 SQLite 驱动程序的连接上并且数据库文件不存在,则会自动创建一个新的空数据库文件。

在实际应用程序中,在尝试对数据执行任何操作之前,您需要确保与数据库的有效连接。否则,您的应用程序可能会崩溃并失败。例如,如果您对尝试在其中创建数据库文件的目录没有写入权限怎么办?您需要确保正在处理打开连接时可能发生的任何错误。

一种常见的调用方式.open()就是把它包裹在一个条件语句。这允许您处理打开连接时可能发生的错误:

>>>
>>> import sys
>>> from PyQt5.QtSql import QSqlDatabase

>>> # Create the connection
>>> con = QSqlDatabase.addDatabase("QSQLITE")
>>> con.setDatabaseName("contacts.sqlite")

>>> # Open the connection and handle errors
>>> if not con.open():
...     print("Unable to connect to the database")
...     sys.exit(1)

将呼叫包装到.open()条件语句中允许您处理打开连接时发生的任何错误。这样,您可以在应用程序运行之前通知用户任何问题。请注意,应用程序退出时会显示退出状态1,通常用于指示程序失败。

在上面的示例中,您使用.open()在交互式会话中,因此您可以使用打印()向用户呈现错误消息。但是,在 GUI 应用程序中,不要使用print(),你通常使用Q消息框目的。和QMessageBox,您可以创建小对话框来向用户呈现信息。

下面是一个示例 GUI 应用程序,说明了处理连接错误的方法:

 1import sys
 2
 3from PyQt5.QtSql import QSqlDatabase
 4from PyQt5.QtWidgets import QApplication, QMessageBox, QLabel
 5
 6# Create the connection
 7con = QSqlDatabase.addDatabase("QSQLITE")
 8con.setDatabaseName("/home/contacts.sqlite")
 9
10# Create the application
11app = QApplication(sys.argv)
12
13# Try to open the connection and handle possible errors
14if not con.open():
15    QMessageBox.critical(
16        None,
17        "App Name - Error!",
18        "Database Error: %s" % con.lastError().databaseText(),
19    )
20    sys.exit(1)
21
22# Create the application's window
23win = QLabel("Connection Successfully Opened!")
24win.setWindowTitle("App Name")
25win.resize(200, 100)
26win.show()
27sys.exit(app.exec_())

if第 14 行中的语句检查连接是否不成功。如果/home/目录不存在或者您没有写入权限,则调用.open()失败,因为无法创建数据库文件。在这种情况下,执行流程进入if语句代码块并在屏幕上显示一条消息。

如果将路径更改为可以写入的任何其他目录,则调用.open()将会成功,您将看到一个显示消息的窗口Connection Successfully Opened!您还将有一个名为的新数据库文件contacts.sqlite在选定的目录中。

请注意,您通过了None作为消息的家长因为,在显示消息时,您还没有创建窗口,因此消息框没有可行的父级。

使用 PyQt 运行 SQL 查询

有了功能齐全的数据库连接,您就可以开始使用数据库了。为此,您可以使用基于字符串的 SQL 查询和QSql查询对象。QSqlQuery允许您在数据库中运行任何类型的 SQL 查询。和QSqlQuery,你可以执行数据操作语言(DML)陈述,例如选择, 插入, 更新, 和删除, 也数据定义语言(DDL)陈述,例如创建表等等。

的构造函数QSqlQuery有多种变体,但在本教程中,您将了解其中两个:

  1. QSqlQuery(query, connection)使用基于字符串的 SQL 构造查询对象query和一个数据库connection。如果未指定连接,或者指定的连接无效,则使用默认的数据库连接。如果query不是空字符串,那么它会立即执行。

  2. QSqlQuery(connection)使用构造查询对象connection。如果connection无效,则使用默认连接。

您还可以创建QSqlQuery对象而不向构造函数传递任何参数。在这种情况下,查询将使用默认数据库连接(如果有)。

要执行查询,您需要调用.exec()在查询对象上。您可以使用.exec()有两种不同的方式:

  1. .exec(query)执行包含在中的基于字符串的 SQL 查询query。它返回True如果查询成功,否则返回False.

  2. .exec()执行之前准备的 SQL 查询。它返回True如果查询成功,否则返回False.

笔记:PyQt 还实现了以下变体QSqlQuery.exec()与名字.exec_()。这些提供了与旧版本 Python 的向后兼容性,其中exec曾经是一个关键词语言的。

现在您已经了解了使用的基础知识QSqlQuery要创建和执行 SQL 查询,您已准备好学习如何将您的知识付诸实践。

执行静态 SQL 查询

要开始使用 PyQt 创建和执行查询,您将启动您最喜欢的代码编辑器或IDE并创建一个名为的 Python 脚本queries.py。保存脚本并向其中添加以下代码:

 1import sys
 2
 3from PyQt5.QtSql import QSqlDatabase, QSqlQuery
 4
 5# Create the connection
 6con = QSqlDatabase.addDatabase("QSQLITE")
 7con.setDatabaseName("contacts.sqlite")
 8
 9# Open the connection
10if not con.open():
11    print("Database Error: %s" % con.lastError().databaseText())
12    sys.exit(1)
13
14# Create a query and execute it right away using .exec()
15createTableQuery = QSqlQuery()
16createTableQuery.exec(
17    """
18    CREATE TABLE contacts (
19        id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
20        name VARCHAR(40) NOT NULL,
21        job VARCHAR(50),
22        email VARCHAR(40) NOT NULL
23    )
24    """
25)
26
27print(con.tables())

在此脚本中,您首先导入要使用的模块和类。然后使用创建数据库连接.addDatabase()使用 SQLite 驱动程序。您将数据库名称设置为"contacts.sqlite"并打开连接。

要创建您的第一个查询,您需要实例化QSqlQuery没有任何争论。查询对象就位后,您可以调用.exec(),传递基于字符串的 SQL 查询作为参数。这种查询称为静态查询因为它没有从查询外部获取任何参数。

上面的 SQL 查询创建一个名为contacts在你的数据库中。该表将包含以下四列:

Column Content
id An integer with the table’s primary key
name A string with the name of a contact
job A string with the job title of a contact
email A string with the email of a contact

上述脚本中的最后一行打印数据库中包含的表的列表。如果你运行脚本,然后您会注意到一个名为contacts.sqlite在您当前的目录中创建。你还会得到类似的东西['contacts', 'sqlite_sequence']打印在您的屏幕上。这列表包含数据库中表的名称。

笔记:基于字符串的 SQL 查询必须根据您正在查询的特定 SQL 数据库使用适当的语法。如果语法错误,那么.exec()忽略查询并返回False.

对于 SQLite,查询一次只能包含一个语句。

呼唤.exec()在一个QSqlQuery对象是在数据库上立即执行基于字符串的 SQL 查询的常用方法,但是如果您想预先准备查询以便稍后执行,该怎么办?这是下一节的主题。

执行动态查询:字符串格式化

到目前为止,您已经学习了如何在数据库上执行静态查询。静态查询是那些不接受参数,因此查询按原样运行。尽管这些查询相当有用,但有时您需要创建查询来检索数据以响应某些输入参数。

在执行时接受参数的查询称为动态查询。使用参数允许您微调查询并检索数据以响应特定的参数值。不同的值会产生不同的结果。您可以使用以下两种方法之一在查询中获取输入参数:

  1. 动态构建查询,使用字符串格式化插入参数值。
  2. 使用占位符参数准备查询,然后将特定值绑定到参数。

第一种方法允许您快速创建动态查询。但是,要安全地使用此方法,您需要确保参数值来自受信任的来源。否则,你可能会面临SQL注入攻击.

以下是如何使用字符串格式在 PyQt 中创建动态查询的示例:

>>>
>>> from PyQt5.QtSql import QSqlQuery, QSqlDatabase

>>> con = QSqlDatabase.addDatabase("QSQLITE")
>>> con.setDatabaseName("contacts.sqlite")
>>> con.open()
True

>>> name = "Linda"
>>> job = "Technical Lead"
>>> email = "linda@example.com"

>>> query = QSqlQuery()
>>> query.exec(
...     f"""INSERT INTO contacts (name, job, email)
...     VALUES ('{name}', '{job}', '{email}')"""
... )
True

在此示例中,您使用f 字符串通过将特定值插入基于字符串的 SQL 查询来创建动态查询。最终查询将数据插入到您的contacts表,现在包含有关的数据Linda.

笔记:在本教程的后面部分,您将了解如何检索和导航存储在数据库中的数据。

请注意,要使这种动态查询起作用,您需要确保要插入的值具有正确的数据类型。因此,您可以在 f 字符串中的占位符周围使用单引号,因为这些值需要是字符串。

执行动态查询:占位符参数

执行动态查询的第二种方法要求您使用模板预先准备查询占位符对于参数。 PyQt 支持两种参数占位符样式:

  1. 甲骨文风格使用命名占位符,例如:name或者:email.
  2. ODBC风格使用问号(?) 作为位置占位符。

请注意,这些样式不能在同一查询中混合使用。您可以查看约束值的方法有关如何使用占位符的更多示例。

笔记:ODBC 代表开放数据库连接.

要在 PyQt 中创建这种动态查询,首先需要为每个查询参数创建一个带有占位符的模板,然后将该模板作为参数传递给.prepare(),它解析、编译并准备查询模板以供执行。如果模板有任何问题,例如 SQL 语法错误,则.prepare()模板编译失败并返回False.

如果准备过程成功,那么prepare()回报True。之后,您可以使用以下命令将特定值传递给每个参数.bindValue()带有命名或位置参数或使用.addBindValue()带有位置参数。.bindValue()有以下两种变体:

  1. .bindValue(placeholder, val)
  2. .bindValue(pos, val)

在第一个变体中,placeholder代表 Oracle 风格的占位符。在第二个变体中,pos表示一个从零开始的整数以及查询中参数的位置。在这两种变体中,val保存要绑定到特定参数的值。

.addBindValue()使用位置绑定将值添加到占位符列表。这意味着调用的顺序.addBindValue()确定将哪个值绑定到准备好的查询中的每个占位符参数。

要开始使用准备好的查询,您可以准备一个INSERT INTO使用一些示例数据填充数据库的 SQL 语句。返回到您在本节中创建的脚本执行静态 SQL 查询并在调用后添加以下代码print():

28# Creating a query for later execution using .prepare()
29insertDataQuery = QSqlQuery()
30insertDataQuery.prepare(
31    """
32    INSERT INTO contacts (
33        name,
34        job,
35        email
36    )
37    VALUES (?, ?, ?)
38    """
39)
40
41# Sample data
42data = [
43    ("Joe", "Senior Web Developer", "joe@example.com"),
44    ("Lara", "Project Manager", "lara@example.com"),
45    ("David", "Data Analyst", "david@example.com"),
46    ("Jane", "Senior Python Developer", "jane@example.com"),
47]
48
49# Use .addBindValue() to insert data
50for name, job, email in data:
51    insertDataQuery.addBindValue(name)
52    insertDataQuery.addBindValue(job)
53    insertDataQuery.addBindValue(email)
54    insertDataQuery.exec()

第一步是创建一个QSqlQuery目的。然后你打电话.prepare()在查询对象上。在本例中,您使用 ODBC 样式作为占位符。您的查询将获取您联系人的值name, job, 和email,所以您需要三个占位符。自从id列是一个自动递增的整数,您不需要为其提供值。

然后,您创建一些示例数据来填充数据库。data持有一个元组列表,每个元组包含三项:每个联系人的姓名、工作和电子邮件。

最后一步是将要传递的值绑定到每个占位符,然后调用.exec()执行查询。为此,您使用for循环。循环头将每个元组解包在data分成三个独立的变量具有方便的名称。然后你打电话.addBindValue()在查询对象上将值绑定到占位符。

请注意,您正在使用位置占位符,所以你调用的顺序.addBindValue()将定义每个值传递给相应占位符的顺序。

当您想要使用来自用户输入的值自定义查询时,这种创建动态查询的方法非常方便。每当您接受用户输入来完成数据库查询时,您都会面临 SQL 注入的安全风险。

在 PyQt 中,结合.prepare(), .bindValue(), 和.addBindValue()完全保护您免受 SQL 注入攻击,因此当您采用不受信任的输入来完成查询时,可以采用这种方法。

如果你执行一个SELECT声明,然后你的QSqlQuery对象将从数据库中的一个或多个表中检索零个或多个记录。查询将保存包含与查询条件匹配的数据的记录。如果没有数据符合条件,那么您的查询将为空。

QSqlQuery提供了一组导航方式您可以使用它来移动查询结果中的记录:

Method Retrieves
.next() The next record
.previous() The previous record
.first() The first record
.last() The last record
.seek(index, relative=False) The record at position index

如果该记录可用,所有这些方法都将查询对象定位在检索到的记录上。这些方法大多都有具体的规则使用它们时适用。使用这些方法,您可以在查询结果中的记录中向前、向后或任意移动。因为他们都返回True或者False,您可以在while 循环一次性浏览所有记录。

这些方法适用于主动查询。成功运行后查询处于活动状态.exec()就可以了,但是查询还没有完成。一旦对有效记录进行活动查询,您就可以使用以下命令从该记录中检索数据.value(索引)。该方法采用从零开始的整数,index,并返回当前记录中该索引(列)处的值。

笔记:如果你执行一个SELECT *查询类型,那么结果中的列将不会遵循已知的顺序。这可能会在您使用时引起问题.value()检索给定列的值,因为无法知道您是否使用了正确的列索引。

您将在下面查看一些示例,了解如何使用某些导航方法在查询中移动。但首先,您需要创建与数据库的连接:

>>>
>>> from PyQt5.QtSql import QSqlDatabase, QSqlQuery

>>> con = QSqlDatabase.addDatabase("QSQLITE")
>>> con.setDatabaseName("contacts.sqlite")
>>> con.open()
True

在这里,您创建并打开一个新连接contacts.sqlite。如果您到目前为止一直在学习本教程,那么该数据库已经包含一些示例数据。现在您可以创建一个QSqlQuery对象并对该数据执行它:

>>>
>>> # Create and execute a query
>>> query = QSqlQuery()
>>> query.exec("SELECT name, job, email FROM contacts")
True

此查询检索有关的数据name, job, 和email存储在的所有联系人中contacts桌子。自从.exec()True,查询已成功,现在是活动查询。您可以使用之前看到的任何导航方法来导航此查询中的记录。您还可以使用以下方法检索记录中任意列的数据.value():

>>>
>>> # First record
>>> query.first()
True

>>> # Named indices for readability
>>> name, job, email = range(3)

>>> # Retrieve data from the first record
>>> query.value(name)
'Linda'

>>> # Next record
>>> query.next()
True
>>> query.value(job)
'Senior Web Developer'

>>> # Last record
>>> query.last()
True
>>> query.value(email)
'jane@example.com'

使用导航方法,您可以在查询结果中移动。和.value(),您可以检索给定记录中任意列的数据。

您还可以使用迭代遍历查询中的所有记录while循环与.next():

>>>
>>> query.exec()
True

>>> while query.next():
...     print(query.value(name), query.value(job), query.value(email))
...
Linda Technical Lead linda@example.com
Joe Senior Web Developer joe@example.com
...

.next(),您可以导航查询结果中的所有记录。.next()工作原理类似于迭代器协议在Python中。迭代查询结果中的记录后,.next()开始返回False直到你跑.exec()再次。致电.exec()从数据库中检索数据并将查询对象的内部指针第一个记录之前的一个位置,所以当你打电话时.next(),您再次获得第一条记录。

您还可以使用相反的顺序循环.previous():

>>>
>>> while query.previous():
...     print(query.value(name), query.value(job), query.value(email))
...
Jane Senior Python Developer jane@example.com
David Data Analyst david@example.com
...

.previous()作品类似于.next(),但迭代是以相反的顺序完成的。换句话说,循环从查询指针的位置回到第一条记录。

有时,您可能希望使用该列的名称来获取标识表中给定列的索引。为此,您可以致电.indexOf()的返回值.record():

>>>
>>> query.first()
True

>>> # Get the index of name
>>> name = query.record().indexOf("name")

>>> query.value(name)
'Linda'

>>> # Finish the query object if unneeded
>>> query.finish()
>>> query.isActive()
False

致电给.indexOf()的结果.record()返回的索引"name"柱子。如果"name"不存在,那么.indexOf()回报-1。当您使用SELECT *列顺序未知的语句。最后,如果您完成了查询对象,则可以通过调用将其变为非活动状态.finish()。这将释放与当前查询对象关联的系统内存。

关闭和删除数据库连接

在实践中,一些 PyQt 应用程序将依赖于数据库,而其他应用程序则不会。依赖于数据库的应用程序通常在创建任何窗口或图形组件之前创建并打开数据库连接,并保持连接打开直到应用程序关闭。

另一方面,不依赖于数据库但使用数据库提供某些功能的应用程序通常仅在需要时(如果有的话)连接到该数据库。在这些情况下,您可以在使用后关闭连接并释放与该连接关联的资源,例如系统内存。

要关闭 PyQt 中的连接,您可以调用。关闭()在连接上。此方法关闭连接并释放任何获取的资源。它还会使任何关联的QSqlQuery对象,因为如果没有活动连接它们就无法正常工作。

以下是如何使用以下命令关闭活动数据库连接的示例.close():

>>>
>>> from PyQt5.QtSql import QSqlDatabase

>>> con = QSqlDatabase.addDatabase("QSQLITE")
>>> con.setDatabaseName("contacts.sqlite")

>>> con.open()
True
>>> con.isOpen()
True

>>> con.close()
>>> con.isOpen()
False

您可以致电.close()连接上以关闭它并释放其所有关联资源。为了确保连接已关闭,您可以调用。开了().

注意QSqlQuery对象在关闭其关联连接后仍保留在内存中,因此您必须通过调用使查询处于非活动状态。结束()或者。清除(),或者通过删除QSqlQuery关闭连接之前的对象。否则,查询对象中会遗漏剩余内存。

您可以重新打开并重用任何先前关闭的连接。那是因为.close()不会从可用连接列表中删除连接,因此它们仍然可用。

您还可以使用以下命令完全删除数据库连接.removeDatabase()。为了安全地执行此操作,请首先使用以下命令完成查询.finish(),然后使用关闭数据库.close(),最后删除连接。您可以使用.removeDatabase(connectionName)删除名为的数据库连接connectionName从可用连接列表中。删除的连接不再可在当前的应用程序中使用。

要删除默认的数据库连接,您可以调用.connectionName()在返回的对象上。数据库()并将结果传递给.removeDatabase():

>>>
>>> # The connection is closed but still in the list of connections
>>> QSqlDatabase.connectionNames()
['qt_sql_default_connection']

>>> # Remove the default connection
>>> QSqlDatabase.removeDatabase(QSqlDatabase.database().connectionName())

>>> # The connection is no longer in the list of connections
>>> QSqlDatabase.connectionNames()
[]

>>> # Try to open a removed connection
>>> con.open()
False

在这里,调用.connectionNames()返回可用连接的列表。在这种情况下,您只有一个连接(默认连接)。然后您使用删除连接.removeDatabase().

笔记:在关闭和删除数据库连接之前,您需要确保使用该连接的所有内容都已删除或设置为使用不同的数据源。否则,你可以有一个资源泄漏.

由于您需要一个连接名称才能使用.removeDatabase(),你打电话给.connectionName()的结果.database()获取默认连接的名称。最后,你打电话.connectionNames()再次确保该连接不再位于可用连接列表中。尝试打开已删除的连接将返回False因为连接不再存在。

使用 PyQt 显示和编辑数据

使用数据库的 GUI 应用程序的一个常见要求是能够使用不同的小部件从数据库加载、显示和编辑数据。桌子, 列表, 和小部件通常在 GUI 中用于管理数据。

PyQt 提供了两种不同类型的小部件来管理数据:

  1. 标准小部件包括用于存储数据的内部容器。
  2. 查看小部件不维护内部数据容器,但使用楷模访问数据。

对于管理小型数据库的小型 GUI 应用程序,您可以使用第一种方法。当您构建管理大型数据库的复杂 GUI 应用程序时,第二种方法很方便。

第二种方法利用了 PyQt 的优势模型视图编程。通过这种方法,您一方面可以拥有代表视图(例如表、列表和树)的小部件,另一方面可以拥有与数据通信的模型类。

了解 PyQt 的模型视图架构

模型-视图-控制器 (MVC)设计模式是一种通用软件模式,旨在将应用程序的代码分为三个通用层,每个层都有不同的作用。

模型照顾商业逻辑该应用程序的看法提供屏幕上的表示,并且控制器连接模型和视图以使应用程序正常工作。

Qt 提供了 MVC 的自定义变体。他们称之为模型-视图架构,并且它也适用于 PyQt。该模式还将逻辑分为三个部分:

  1. 楷模与数据通信并访问数据。它们还定义了视图和委托用来访问数据的接口。所有模型均基于QA抽象项目模型。一些常用的模型包括QStandardItemModel, QFileSystemModel,以及 SQL 相关模型。

  2. 意见负责向用户显示数据。它们也具有与 MVC 模式中的控制器类似的功能。所有观点均基于QAbstractItemView。一些常用的视图是QListView, QTableView, 和QTreeView.

  3. 代表们绘制视图项目并提供用于修改项目的编辑器小部件。如果某个项目被修改,他们还会与模型进行通信。基类是QAbstractItemDelegate.

将类分成这三个组件意味着模型上的更改将自动反映在关联的视图或小部件上,并且通过委托对视图或小部件进行的更改将自动更新底层模型。

此外,您可以在不同的视图中显示相同的数据,而不需要多个模型。

使用标准小部件类

PyQt 提供了一堆标准小部件用于在 GUI 应用程序中显示和编辑数据。这些标准小部件提供表格、树和列表等视图。它们还提供用于存储数据的内部容器和方便的代表来编辑数据。所有这些功能都分为一个类。

以下是其中三个标准类:

Standard Class Displays
QListWidget A list of items
QTreeWidget A hierarchical tree of items
QTableWidget A table of items

QTableWidget在显示和编辑数据方面,可以说是最受欢迎的小部件。它创建了一个二维数组QTableWidgetItem对象。每个项目都以字符串形式保存一个单独的值。所有这些值都显示并组织在行和列的表格中。

您至少可以执行以下操作QTableWidget目的:

  • 使用委托对象编辑其项目的内容
  • 使用添加新项目.setItem()
  • 使用设置行数和列数.setRowCount().setColumnCount()
  • 使用添加垂直和水平标题标签设置水平标题标签().setVerticalHeaderLabels

这是一个示例应用程序,展示了如何使用QTableWidget对象在 GUI 中显示数据。该应用程序使用您在前面部分中创建和填充的数据库,因此如果您想运行它,则需要将代码保存到您拥有该应用程序的同一目录中contacts.sqlite数据库:

QTableWidget Example

如果双击表格的任何单元格,则您将能够编辑单元格的内容。但是,您的更改不会保存到数据库中。

这是您的应用程序的代码:

 1import sys
 2
 3from PyQt5.QtSql import QSqlDatabase, QSqlQuery
 4from PyQt5.QtWidgets import (
 5    QApplication,
 6    QMainWindow,
 7    QMessageBox,
 8    QTableWidget,
 9    QTableWidgetItem,
10)
11
12class Contacts(QMainWindow):
13    def __init__(self, parent=None):
14        super().__init__(parent)
15        self.setWindowTitle("QTableView Example")
16        self.resize(450, 250)
17        # Set up the view and load the data
18        self.view = QTableWidget()
19        self.view.setColumnCount(4)
20        self.view.setHorizontalHeaderLabels(["ID", "Name", "Job", "Email"])
21        query = QSqlQuery("SELECT id, name, job, email FROM contacts")
22        while query.next():
23            rows = self.view.rowCount()
24            self.view.setRowCount(rows + 1)
25            self.view.setItem(rows, 0, QTableWidgetItem(str(query.value(0))))
26            self.view.setItem(rows, 1, QTableWidgetItem(query.value(1)))
27            self.view.setItem(rows, 2, QTableWidgetItem(query.value(2)))
28            self.view.setItem(rows, 3, QTableWidgetItem(query.value(3)))
29        self.view.resizeColumnsToContents()
30        self.setCentralWidget(self.view)
31
32def createConnection():
33    con = QSqlDatabase.addDatabase("QSQLITE")
34    con.setDatabaseName("contacts.sqlite")
35    if not con.open():
36        QMessageBox.critical(
37            None,
38            "QTableView Example - Error!",
39            "Database Error: %s" % con.lastError().databaseText(),
40        )
41        return False
42    return True
43
44app = QApplication(sys.argv)
45if not createConnection():
46    sys.exit(1)
47win = Contacts()
48win.show()
49sys.exit(app.exec_())

本示例中发生的情况如下:

  • 第 18 至 20 行创建一个QTableWidget对象,将列数设置为4,并为每列标题设置用户友好的标签。
  • 21号线创建并执行SELECT对数据库进行 SQL 查询以获取数据库中的所有数据contacts桌子。
  • 22号线开始一个while使用循环来导航查询结果中的记录.next().
  • 24号线将表中的行数增加1使用.setRowCount().
  • 第 25 至 28 行使用以下命令将数据项添加到表中.setItem()。请注意,由于id列是整数,您需要将它们转换为字符串才能将它们存储在QTableWidgetItem目的。

.setItem()采用三个参数:

  1. row保存一个从零开始的整数,表示表中给定行的索引。
  2. column保存一个从零开始的整数,表示表中给定列的索引。
  3. item持有QTableWidgetItem您需要放置在表中给定单元格的对象。

最后,你打电话.resizeColumnsToContents()在您的视图上根据其内容调整列的大小并提供更好的数据呈现。

使用标准小部件显示和编辑数据库表可能成为一项具有挑战性的任务。这是因为您将拥有相同数据的两个副本。换句话说,您将在两个位置拥有数据副本:

  1. 在小部件之外,在您的数据库中
  2. 在小部件内部,在小部件的内部容器中

您负责手动同步数据的两个副本,这可能是一项烦人且容易出错的操作。幸运的是,您可以使用 PyQt 的模型视图架构来避免大多数此类问题,正如您将在下一节中看到的那样。

使用视图和模型类

PyQt 的模型视图类消除了使用标准小部件类构建数据库应用程序时可能出现的数据重复和同步问题。模型-视图架构允许您使用多个视图来显示相同​​的数据,因为您可以将一个模型传递给多个视图。

模型类提供了应用程序编程接口(API)您可以使用它来操作数据。视图类提供了方便的委托对象,您可以使用它们直接编辑视图中的数据。要将视图与给定模块连接,您需要调用.setModel()在视图对象上。

PyQt 提供了一组支持模型视图架构的视图类:

View Class Displays
QListView A list of items that take values directly from a model class
QTreeView A hierarchical tree of items that take values directly from a model class
QTableView A table of items that take values directly from a model class

您可以使用这些视图类和模型类来创建数据库应用程序。这将使您的应用程序更加健壮、编码速度更快并且不易出错。

以下是 PyQt 提供的一些用于处理 SQL 数据库的模型类:

Model Class Description
QSqlQueryModel A read-only data model for SQL queries
QSqlTableModel An editable data model for reading and writing records in a single table
QSqlRelationalTableModel An editable data model for reading and writing records in a relational table

将这些模型之一连接到物理数据库表或查询后,您可以使用它们来填充您的视图。视图提供委托对象,允许您直接在视图中修改数据。连接到视图的模型将更新数据库中的数据以反映视图中的任何更改。请注意,您不必手动更新数据库中的数据。该模型将为您做到这一点。

这是一个示例,展示了如何使用QTableView对象和一个QSqlTableModel对象一起使用 PyQt 的模型-视图架构构建数据库应用程序:

QTableView Example

To edit the data in a cell of the table, you can double-click the cell. A convenient delegate widget will show in the cell, allowing you to edit its content. Then you can hit Enter to save the changes.

自动处理和保存数据更改的能力是使用 PyQt 的模型视图类的更重要的优势之一。模型-视图架构将提高您的工作效率并减少您必须自己编写数据操作代码时可能出现的错误。

这是创建应用程序的代码:

 1import sys
 2
 3from PyQt5.QtCore import Qt
 4from PyQt5.QtSql import QSqlDatabase, QSqlTableModel
 5from PyQt5.QtWidgets import (
 6    QApplication,
 7    QMainWindow,
 8    QMessageBox,
 9    QTableView,
10)
11
12class Contacts(QMainWindow):
13    def __init__(self, parent=None):
14        super().__init__(parent)
15        self.setWindowTitle("QTableView Example")
16        self.resize(415, 200)
17        # Set up the model
18        self.model = QSqlTableModel(self)
19        self.model.setTable("contacts")
20        self.model.setEditStrategy(QSqlTableModel.OnFieldChange)
21        self.model.setHeaderData(0, Qt.Horizontal, "ID")
22        self.model.setHeaderData(1, Qt.Horizontal, "Name")
23        self.model.setHeaderData(2, Qt.Horizontal, "Job")
24        self.model.setHeaderData(3, Qt.Horizontal, "Email")
25        self.model.select()
26        # Set up the view
27        self.view = QTableView()
28        self.view.setModel(self.model)
29        self.view.resizeColumnsToContents()
30        self.setCentralWidget(self.view)
31
32def createConnection():
33    con = QSqlDatabase.addDatabase("QSQLITE")
34    con.setDatabaseName("contacts.sqlite")
35    if not con.open():
36        QMessageBox.critical(
37            None,
38            "QTableView Example - Error!",
39            "Database Error: %s" % con.lastError().databaseText(),
40        )
41        return False
42    return True
43
44app = QApplication(sys.argv)
45if not createConnection():
46    sys.exit(1)
47win = Contacts()
48win.show()
49sys.exit(app.exec_())

以下是这段代码中发生的事情:

  • 18号线创建一个可编辑的QSqlTableModel目的。
  • 19号线将您的模型与contacts数据库中的表使用.setTable().
  • 20号线设置编辑策略模型的OnFieldChange。如果用户直接在视图中修改任何数据,此策略允许模型自动更新数据库中的数据。
  • 第 21 至 24 行使用以下命令为模型的水平标题设置一些用户友好的标签.setHeaderData().
  • 25号线从数据库加载数据并通过调用填充模型.select().
  • 27号线创建表视图对象以显示模型中包含的数据。
  • 28号线通过调用将视图与模型连接起来.setModel()以您的数据模型作为参数的视图。
  • 29号线来电.resizeColumnsToContents()在视图对象上调整表格以适应其内容。

就是这样!您现在拥有一个功能齐全的数据库应用程序。

在 PyQt 中使用 SQL 数据库:最佳实践

当谈到有效使用 PyQt 的 SQL 支持时,您可能希望在应用程序中使用一些最佳实践:

  • 支持 PyQt 的 SQL 支持优于 Python 标准库或第三方库,以利用这些类与 PyQt 的其余类和基础设施(主要是模型-视图架构)的自然集成。

  • 使用先前准备的动态查询使用参数占位符并将值绑定到这些参数.addBindValue().bindValue()。这将有助于防止 SQL 注入攻击。

  • 处理错误打开数据库连接以避免意外行为和应用程序崩溃时可能会发生这种情况。

  • 关闭并删除不需要的数据库连接和查询释放任何获得的系统资源。

  • 尽量减少使用SELECT *查询以避免检索数据时出现问题.value().

  • 将您的密码传递至.open()而不是.setPassword()以避免损害您的安全的风险。

  • 利用 PyQt 的模型-视图架构及其与 PyQt 的 SQL 支持的集成,使您的应用程序更加健壮。

此列表并不完整,但它将帮助您在开发数据库应用程序时更好地利用 PyQt 的 SQL 支持。

结论

使用 PyQt 的内置支持来处理SQL数据库对于任何创建 PyQt GUI 应用程序并需要将其连接到数据库的 Python 开发人员来说,这是一项重要技能。 PyQt 提供了一组一致的类来管理 SQL 数据库。

这些类与 PyQt 的模型视图架构完全集成,允许您开发能够以用户友好的方式管理数据库的 GUI 应用程序。

在本教程中,您学习了如何:

  • 使用 PyQtSQL支持连接到数据库
  • 执行SQL查询使用 PyQt 在数据库上
  • 使用 PyQt 构建数据库应用程序模型-视图架构
  • 使用 PyQt 显示和编辑数据库中的数据小部件

有了这些知识,您就可以在创建重要的数据库应用程序时提高工作效率,并使 GUI 应用程序更加健壮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 PyQt 处理 SQL 数据库:基础知识 的相关文章

  • python实现天气数据爬取实现数据可视化和天气查询gui界面设计

    在学校大一实训中 我的实训项目就是使用python爬取天气数据并且实现gui图形界面的设计 实训结束了 希望自己的代码可以帮助大家的学习 代码是大一时候写的 比较青涩 大家多包涵 第一个部分是getdata的部分 就是爬取数据 并将数据存放
  • 『贪吃蛇』AI 算法简易实现(中秋特别版)

    前言 一年一度的中秋节就快到了 平台也有各种各样的中秋发文活动 正在翻阅时偶然间我看到了这篇文章 兔饼大作战 吃月饼 见月亮 还能咬自己 欢庆中秋特制版 掘金 juejin cn 大家肯定比较熟悉了 这个游戏的内核就是贪吃蛇 作者也是对玩法
  • python 实现GUI(图形用户界面)编程

    Python支持多种图形界面的第三方库 包括 wxWidgets Qt GTK Tkinter Tkinter 模块 Tk 接口 是 Python 的标准 Tk GUI 工具包的接口 Tk 和 Tkinter 可以在大多数的 Unix 平台
  • PyQty5—第三课:按钮与函数绑定(2)(附完整代码)

    在上一节课中 我们已经学会了将按钮与函数进行绑定 从而自己可以对函数进行扩展 那么今天我们将会学习另一个方法将按钮与函数进行绑定 上一节课的复习链接 点我 gt PyQty5 第二课 首相我们把上一节课的代码中的绑定函数以及对象注释掉 代码
  • QT vector转QVector(来自stackflow)

    std vector
  • Littlevgl的时间显示

    Littlevgl的时间显示 基于stm32的littlevgl RTC时间显示 获取时间 不想看的可以点击 完整代码下载代码 验证效果 效果图在最底 获取RTC时间 放入main函数的while循环里面 void calendar get
  • LittlevGL在PC端运行

    上面是我的微信和QQ群 欢迎新朋友的加入 参考官网指导 https github com littlevgl pc simulator sdl visual studio 获取到vs的工程 打开解决方案 编译运行 在源码目录下 打开main
  • 【GUI】LVGL8内存泄漏分析

    LVGL版本 V8 0 2 平台 ESP32S3 在调试过程中 发现有两个界面 在重复退出再进入时内存会不断增加的吃内存现象 然后做了分析和研究 1 样式style吃内存 在主页面 进入simple页面 再退出到主页面 再次进入simple
  • QT 信号发送多个参数

    你可以把多个参数包装为一个类发送 实测是可以的
  • 【Qt教程】2.6 - Qt5 自定义控件封装

    自定义控件是将原有控件组合 封装 并填入自定义功能 留出适当的函数接口 方便其他控件的调用 设计窗口时 可以将控件拖入 方便模块化设计 GitHub代码仓库 Qt学习例程 1 建立工程 新建自定义控件 创建widget工程 新建控件 Add
  • 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多 比如Gnome桌面使用GTK 作为默认的图形界面库 KDE桌面使用Qt作为默认的图形界面库 wxWidgets则是另一个使用广泛的图形库 此外使用Java中的Swing AWT组件也可以用于开发Li
  • YOLOv8目标检测PySide6 GUI可视化界面

    课程链接 https edu csdn net course detail 38552 YOLOv8目标检测PySide6 GUI可视化界面效果图如下 YOLOv8目标检测PySide6 GUI可视化界面支持本地图片和视频推理 摄像头实时视
  • Java Swing基础(层次结构,组件,布局管理)

    Swing基础层次结构 图形环境和图形对象 坐标 GUI组件的左上角坐标默认为 0 0 从左上角到右下角 水平坐标x和垂直坐标y增加 坐标的单位是像素 Graphics对象 专门管理图形环境 Graphics类是一个抽象类 抽象类Graph
  • QT实现电子时钟

    QT实现电子时钟 实现方法 实现效果 代码 头文件 源文件 实现方法 主窗口QDialog调用QLCDNumber窗口 实现效果 代码 头文件 dialog h ifndef DIALOG H define DIALOG H include
  • python3GUI--抖音无水印视频下载工具(附源码)

    文章目录 一 准备工作 二 预览 0 复制抖音分享短链接 1 启动 2 运行 3 结果 三 设计流程 1 总体设计 2 详细设计 四 源代码 五 说明 总结 hello 大家好啊 失踪人口回归了 捂脸 本次使用tkinter撰写一篇 抖音无
  • VSCode『SSH』连接服务器『GUI界面』传输

    前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型 pygame 但是我是使用 SSH 连接的 不能很好的显示模型训练的效果画面 所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注 我们没有采用
  • Python eval():动态计算表达式

    目录 Understanding Python s eval 第一个参数 表达式 第二个参数 全局变量 第三种说法 本地人 Evaluating Expressions With Python s eval 布尔表达式 数学表达式 通用表达
  • 了解 Python 模拟对象库

    目录 什么是模拟 Python 模拟库 The Mock Object 惰性属性和方法 断言和检查 管理模拟的返回值 管理模拟的副作用 配置你的模拟 patch patch 作为装饰器 patch 作为上下文管理器 修补对象的属性 在哪里打
  • PyQt 布局:创建具有专业外观的 GUI 应用程序

    目录 在 GUI 上布置图形元素 储备 PyQt 布局库 Using General Purpose Layout Managers 构建水平布局 QHBoxLayout 构建垂直布局 QVBoxLayout 在网格中排列小部件 QGrid
  • 使用 Python、PyQt 和 SQLite 构建联系簿

    目录 演示 Python 联系手册 项目概况 先决条件 Step 1 Creating the Contact Book s Skeleton App With PyQt 构建通讯录项目 创建应用程序的主窗口 编码和运行应用程序 第 2 步

随机推荐

  • 正则表达式:Python 中的正则表达式(第 2 部分)

    目录 re Module Functions 搜索功能 替代函数 实用功能 Compiled Regex Objects in Python 为什么要费心编译正则表达式 正则表达式对象方法 正则表达式对象属性 Match Object Me
  • 什么是数据工程?它适合您吗?

    目录 数据工程师做什么 What Are the Responsibilities of Data Engineers 数据流 数据标准化和建模 数据清理 数据可访问性 What Are Common Data Engineering Sk
  • 更多锁具

    在本课程中 您将继续探索锁并了解僵局以及如何避免它 锁也称为互斥量在其他语言中 如果您下载示例代码 您可以获得自己的副本11 more locks py 下载 Sample Code zip 12 9KB 要了解更多信息 您还可以查看有关的
  • 模拟开关/外壳 – 完整示例

    该视频总结了有关用 Python 模拟 Switch Case 的课程 在本课程中 您将看到一个真实世界的示例 说明如何使用 Python 字典来模拟 switch caselambda功能 def dispatch dict operat
  • 有效使用 NumPy 的 np.arange()

    数值模拟是数值计算的基本 Python 库 它最重要的类型是数组类型被称为ndarray NumPy 提供了很多数组创建例程对于不同的情况 arange 就是这样一个基于的函数数值范围 它通常被称为np arange 因为np是 NumPy
  • Python 中的 Minimax:学习如何输掉 Nim 游戏

    目录 玩一个简化的 Nim 游戏 Get to Know the Minimax Algorithm 探索游戏树 找到最佳的下一步行动 Lose the Game of Nim Against a Python Minimax Player
  • Python pandas:你可能不知道的技巧和功能

    目录 1 在解释器启动时配置选项和设置 2 用pandas的测试模块制作玩具数据结构 3 利用访问器方法 4 从组件列创建 DatetimeIndex 5 使用分类数据节省时间和空间 6 通过迭代内省 Groupby 对象 7 使用此映射技
  • 版本控制

    你应该使用版本控制随着时间的推移 保留您的对象的完整记录 它还充当防止意外删除对象的保护机制 当您请求版本化对象 Boto3 将检索最新版本 当您添加对象的新版本时 该对象总共占用的存储空间是其版本大小的总和 因此 如果您存储一个 1 GB
  • 在 Python 中使用 JSON 数据

    JSON 是一种轻量级数据交换格式 它允许我们将 Python 程序中的对象表示为可以通过互联网发送的人类可读文本 许多 API 和数据库使用 JSON 进行通信 您将学习如何使用 Python 的内置函数json模块将程序中的数据序列化为
  • Python 社区采访 Eric Wastl

    本周 我们加入了埃里克 瓦斯特 高级架构师TCGP播放器和创始人代码的出现 AoC 请加入我们 讨论 AoC 的起源 在解决 AoC 中的代码挑战时如何避免常见陷阱 以及 Eric 在每年的 3 8 秒 空闲时间中所做的事情 如果您在阅读本
  • 视频字幕和脚本现在可在 Real Python 上使用

    嘿 今天我有一个重大更新要分享 真正的 Python 视频课程现在有完整的字幕和成绩单 我认为这对于可访问性有很大帮助 并使您最喜欢的 Python 学习资源更易于查看和搜索 让我们做一个快速演示 现在附带视频课程完整字幕您可以在方便时打开
  • 识别无效的 Python 语法

    Python 以其简单的语法而闻名 然而 当你第一次学习Python 或者当你在另一种编程语言上有扎实的背景后才开始学习Python 你可能会遇到一些Python不允许的事情 如果您曾经收到过SyntaxError当尝试运行 Python
  • 使用 Python 发送电子邮件

    目录 Getting Started 选项 1 设置 Gmail 帐户进行开发 选项 2 设置本地 SMTP 服务器 Sending a Plain Text Email 启动安全 SMTP 连接 发送您的纯文本电子邮件 Sending F
  • 真正的 Python 安全性和报告

    真正的 Python 安全性和报告 如果您发现安全漏洞 请通过以下方式告知我们信息 security realpython com 我们尝试尽快回复 修复 并非常感谢您的帮助 感谢以下人员发现并负责任地披露了 Real Python 中的安
  • 把它写出来

    当您作为一名新程序员在您的旅程中取得进展时 您可能想知道是否应该做笔记 是的你应该 事实上 研究表明 手写笔记最有利于长期记忆 这对于那些致力于成为全职开发人员的人来说尤其有益 因为许多面试将涉及在白板上编写代码 一旦您开始处理小型项目和程
  • 2020 年 11 月 4 日

    主持人 David Amos 回答了 Real Python 成员的问题 在这次会议上 我们讨论了 Python 新闻和更新 代码如何在导入时运行 这可能是一个问题吗 有关静态网站生成器的更多信息 Python 在硬件项目上的应用 过渡到数
  • 最好的 Python 书籍

    目录 Best Books for Learning Python Python 速成课程 Head First Python 第二版 用 Python 发明你自己的电脑游戏 第四版 思考 Python 如何像计算机科学家一样思考 第二版
  • 选择优先级队列

    优先级队列是队列的特殊实例 其中存储顺序基于内部项目的优先级 这通常用于调度算法 使调度中的某些项目比其他项目更重要 在 Python 中获取优先级队列有多种方法 您可以使用内置的list类型结合sort 函数 根据优先级排序 或者 而不是
  • 使用 PyQt 处理 SQL 数据库:基础知识

    目录 Connecting PyQt to an SQL Database 创建数据库连接 处理多个连接 使用不同的 SQL Divers 打开数据库连接 Running SQL Queries With PyQt 执行静态 SQL 查询
  • map() 函数:概述

    在本节中 您将了解更多有关函数式编程的基础知识 即如何使用map 函数进行变换数据结构 您将采用本课程之前视频中使用不可变数据结构表示的示例数据集 然后创建一个转变的使用Python内置的相同数据的版本map 功能 map 是 Python