鱼C论坛

 找回密码
 立即注册
查看: 3146|回复: 10

嗨嗨嗨,又是我,新手又有问题出现,求大神帮忙

[复制链接]
发表于 2023-4-11 11:39:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
写了个查询界面,sql语句查询结果正常,sql_result输出结果是x行10列,

                               
登录/注册后可看大图


我的需求如下

                               
登录/注册后可看大图


我想QTableView.setmodel(sql_resule)

                               
登录/注册后可看大图


只能用for循环一个一个单元格添加数据么?有简单点的办法么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-11 11:44:33 | 显示全部楼层
要将 SQL 查询结果放入 QTableView 中,您可以使用 QSqlTableModel 或 QSqlQueryModel 作为模型。

这些模型可以处理 SQL 查询结果,将其转换为适合 QTableView 显示的格式。这样您就不需要使用 for 循环逐个添加数据了。

首先,确保您已经从 PyQt5.QtSql 模块导入了 QSqlQueryModel 和 QSqlDatabase:

  1. from PyQt5.QtSql import QSqlQueryModel, QSqlDatabase
复制代码


然后,您可以按照以下步骤将查询结果设置为 QTableView 的模型:

  • 使用您的数据库连接创建一个 QSqlDatabase 实例。
  • 创建一个 QSqlQueryModel 实例。
  • 设置 QSqlQueryModel 实例的查询。
  • 将 QSqlQueryModel 实例设置为 QTableView 的模型。


示例代码:

  1. from PyQt5.QtWidgets import QApplication, QTableView
  2. from PyQt5.QtSql import QSqlQueryModel, QSqlDatabase

  3. app = QApplication([])

  4. # 1. 创建 QSqlDatabase 实例
  5. db = QSqlDatabase.addDatabase("QSQLITE")  # 或使用您的数据库类型
  6. db.setDatabaseName("your_database_name.db")  # 使用您的数据库名
  7. db.open()

  8. # 2. 创建 QSqlQueryModel 实例
  9. model = QSqlQueryModel()

  10. # 3. 设置 QSqlQueryModel 实例的查询
  11. query = "SELECT * FROM your_table_name"  # 使用您的 SQL 查询和表名
  12. model.setQuery(query)

  13. # 4. 将 QSqlQueryModel 实例设置为 QTableView 的模型
  14. view = QTableView()
  15. view.setModel(model)
  16. view.show()

  17. app.exec_()
复制代码


替换上述代码中的占位符(如 "your_database_name.db" 和 "your_table_name")为您实际使用的数据库名和表名。

这样,您就可以直接将 SQL 查询结果设置为 QTableView 的模型,而无需逐个添加数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-11 14:35:43 | 显示全部楼层
isdkz 发表于 2023-4-11 11:44
要将 SQL 查询结果放入 QTableView 中,您可以使用 QSqlTableModel 或 QSqlQueryModel 作为模型。

这些 ...

我的数据库连接信息是单独写在Dbconnect.py里的,如果用到查询就import Dbconnect
Dbconnect.py 代码如下

import oracledb
import os

# 初始化Oracle客户端,启用thick模式
oracledb.init_oracle_client(lib_dir=r"C:\instantclient_11_2")

# 连接oracle数据库
try:
    conn = oracledb.connect(
        host="130.1.10.241",
        port=1521,
        user="XXK",
        password="888xxk",
        service_name="orcl"
        )
    cursor = conn.cursor()
except:
    print("数据库连接失败!")

我头文件import了之后,请问还需要创建 QSqlDatabase 实例吗?如果需要应该怎么写,是这样写吗?
db = QSqlDatabase.addDatabase("QOracle")  # 或使用您的数据库类型
db.setDatabaseName("xxk.db")  # 使用您的数据库名
db.open()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-11 14:39:45 | 显示全部楼层
hejialiangya 发表于 2023-4-11 14:35
我的数据库连接信息是单独写在Dbconnect.py里的,如果用到查询就import Dbconnect
Dbconnect.py 代码如 ...

了解您的情况了,如果您已经使用 oracledb 建立了数据库连接,那么您可以使用 QSqlQueryModel 来直接执行查询并将结果显示在 QTableView 中。

在这种情况下,您不需要创建 QSqlDatabase 实例。请确保您已经从 PyQt5.QtSql 模块导入了 QSqlQueryModel。

您可以按照以下步骤将查询结果设置为 QTableView 的模型:

  • 使用您的数据库连接创建一个 QSqlQueryModel 实例。
  • 设置 QSqlQueryModel 实例的查询。
  • 将 QSqlQueryModel 实例设置为 QTableView 的模型。


示例代码:

  1. from PyQt5.QtWidgets import QApplication, QTableView
  2. from PyQt5.QtSql import QSqlQueryModel
  3. import Dbconnect

  4. app = QApplication([])

  5. # 1. 创建 QSqlQueryModel 实例
  6. model = QSqlQueryModel()

  7. # 2. 设置 QSqlQueryModel 实例的查询
  8. query = "SELECT * FROM your_table_name"  # 使用您的 SQL 查询和表名
  9. model.setQuery(query, Dbconnect.conn)  # 使用您的数据库连接

  10. # 3. 将 QSqlQueryModel 实例设置为 QTableView 的模型
  11. view = QTableView()
  12. view.setModel(model)
  13. view.show()

  14. app.exec_()
复制代码


替换上述代码中的占位符(如 "your_table_name")为您实际使用的表名。

这样,您就可以直接将 SQL 查询结果设置为 QTableView 的模型,而无需逐个添加数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-11 15:29:43 | 显示全部楼层
isdkz 发表于 2023-4-11 14:39
了解您的情况了,如果您已经使用 oracledb 建立了数据库连接,那么您可以使用 QSqlQueryModel 来直接执行 ...

您好,您的第二步,我查询为什么总是没有结果

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-11 15:42:44 | 显示全部楼层
hejialiangya 发表于 2023-4-11 15:29
您好,您的第二步,我查询为什么总是没有结果


setQuery 方法是用于在 QSqlQueryModel 中设置一个 SQL 查询语句的。

它主要用于从数据库中获取数据并将这些数据存储在模型中,以便在视图(如 QTableView)中显示。这个方法没有返回值。这跟你直接打印 cursor.execute 的执行结果也为空一样的道理,cursor执行后还得用 fetchall 把结果取出来

具体而言,当您调用 setQuery 方法时,它将执行 SQL 查询,并将查询结果存储在模型中。这使得您可以将 QSqlQueryModel 实例关联到 QTableView,从而自动显示查询结果。

下面是一个简单的示例,说明如何使用 QSqlQueryModel 和 setQuery:

  1. from PyQt5.QtWidgets import QApplication, QTableView
  2. from PyQt5.QtSql import QSqlDatabase, QSqlQueryModel

  3. app = QApplication([])

  4. # 连接数据库
  5. db = QSqlDatabase.addDatabase("QSQLITE")
  6. db.setDatabaseName("your_database_name.db")
  7. db.open()

  8. # 创建 QSqlQueryModel 实例
  9. model = QSqlQueryModel()

  10. # 设置 QSqlQueryModel 实例的查询
  11. query = "SELECT * FROM your_table_name"
  12. model.setQuery(query)

  13. # 将 QSqlQueryModel 实例设置为 QTableView 的模型
  14. view = QTableView()
  15. view.setModel(model)
  16. view.show()

  17. app.exec_()
复制代码


在这个示例中,model.setQuery(query) 将执行查询并将结果存储在模型中。然后,通过将模型设置为 QTableView 的模型,您可以在视图中看到查询结果。

也可以用以下方法获取查询结果:

在使用 setQuery 方法设置查询后,您可以使用 QSqlQueryModel 的一些方法来查看查询结果。例如,您可以使用 rowCount() 和 columnCount() 方法来查看查询结果中的行数和列数,还可以使用 record() 和 data() 方法来检索特定单元格的数据。

以下是一个示例,说明如何在调用 setQuery 之后查看查询结果:

  1. from PyQt5.QtWidgets import QApplication, QTableView
  2. from PyQt5.QtSql import QSqlDatabase, QSqlQueryModel

  3. app = QApplication([])

  4. # 连接数据库
  5. db = QSqlDatabase.addDatabase("QSQLITE")
  6. db.setDatabaseName("your_database_name.db")
  7. db.open()

  8. # 创建 QSqlQueryModel 实例
  9. model = QSqlQueryModel()

  10. # 设置 QSqlQueryModel 实例的查询
  11. query = "SELECT * FROM your_table_name"
  12. model.setQuery(query)

  13. # 获取查询结果的行数和列数
  14. row_count = model.rowCount()
  15. column_count = model.columnCount()
  16. print(f"查询结果有 {row_count} 行,{column_count} 列。")

  17. # 遍历查询结果并打印每个单元格的数据
  18. for row in range(row_count):
  19.     for col in range(column_count):
  20.         cell_data = model.data(model.index(row, col))
  21.         print(f"({row}, {col}): {cell_data}")

  22. # 将 QSqlQueryModel 实例设置为 QTableView 的模型
  23. view = QTableView()
  24. view.setModel(model)
  25. view.show()

  26. app.exec_()
复制代码

这个示例将遍历查询结果,并打印每个单元格的数据。注意,QSqlQueryModel 通常与视图(如 QTableView)一起使用,可以自动显示查询结果。因此,在实际应用中,您可能不需要手动查看和处理查询结果,而是将其直接显示在视图中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-11 16:19:12 | 显示全部楼层
本帖最后由 hejialiangya 于 2023-4-11 16:20 编辑
isdkz 发表于 2023-4-11 15:42
setQuery 方法是用于在 QSqlQueryModel 中设置一个 SQL 查询语句的。

它主要用于从数据库中获取数据 ...


谢大佬不厌其烦讲解,原理讲的很透,有点懂了。
我试了下查询结果行列检测,怀疑是不是因为我查询没有关联数据库?
在已有Dbconnect.py的前提下需要再指定数据库连接么?
我学着你的方法加了DB连接,发现还是0行0列,是不是我写的有问题

                               
登录/注册后可看大图

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-11 16:37:58 | 显示全部楼层
hejialiangya 发表于 2023-4-11 16:19
谢大佬不厌其烦讲解,原理讲的很透,有点懂了。
我试了下查询结果行列检测,怀疑是不是因为我查询没有 ...

确实,要使 QSqlQueryModel 正确执行查询并返回结果,您需要确保已正确连接到数据库。在您的情况下,您需要使用 Qt 提供的 Oracle 支持(QOCI)来连接到数据库。

首先,请确保您已安装 Qt 的 Oracle 数据库驱动程序。然后,使用以下代码连接到数据库:

  1. from PyQt5.QtSql import QSqlDatabase

  2. db = QSqlDatabase.addDatabase("QOCI")
  3. db.setHostName("130.1.10.241")
  4. db.setPort(1521)
  5. db.setDatabaseName("orcl")
  6. db.setUserName("XXK")
  7. db.setPassword("888xxk")

  8. if db.open():
  9.     print("数据库连接成功")
  10. else:
  11.     print("数据库连接失败")
复制代码


请注意,这里我们使用 setHostName、setPort、setDatabaseName、setUserName 和 setPassword 方法设置连接参数,而不是 setDatabaseName。

一旦您连接到数据库,请确保在设置 QSqlQueryModel 查询时将数据库连接传递给 setQuery 方法,如下所示:

  1. model.setQuery(query, db)
复制代码


这将确保查询在正确的数据库连接上执行,并返回预期的结果。

如果问题仍然存在,您可以检查 QSqlQueryModel 中的错误,以便了解查询执行过程中的任何问题。

要检查错误,请使用 model.lastError() 方法,例如:

  1. error = model.lastError()
  2. if error.isValid():
  3.     print(f"查询错误: {error.text()}")
  4. else:
  5.     print("查询成功")
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-12 11:30:57 | 显示全部楼层
isdkz 发表于 2023-4-11 16:37
确实,要使 QSqlQueryModel 正确执行查询并返回结果,您需要确保已正确连接到数据库。在您的情况下,您需 ...

今天试了一下,调试--【控制台】提示:

数据库连接失败
查询错误: Driver not loaded Driver not loaded
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 12:58:36 | 显示全部楼层
hejialiangya 发表于 2023-4-12 11:30
今天试了一下,调试--【控制台】提示:

数据库连接失败

看起来您遇到了驱动程序未加载的问题。

这可能是由于 Qt 未正确安装 QOCI 驱动程序,或者驱动程序未找到导致的。

首先,请确保您已安装 Qt 的 Oracle 数据库驱动程序。如果您使用的是预编译的 Qt 安装包,它可能不包含 QOCI 驱动程序。

您可以通过查看 plugins/sqldrivers 目录来检查驱动程序是否存在。如果不存在,您需要从源代码编译 Qt 以包含 QOCI 驱动程序。

有关如何构建和安装 Qt Oracle 驱动程序的详细信息,请参阅官方文档:



接下来,请确保您已正确设置环境变量以指向 Oracle 客户端库。

您可能需要设置 ORACLE_HOME 和 LD_LIBRARY_PATH(Linux)或 PATH(Windows)环境变量。

例如,在 Windows 上,您可以这样设置环境变量:

  1. import os

  2. os.environ["ORACLE_HOME"] = r"C:\oracle\instantclient_11_2"
  3. os.environ["PATH"] = os.environ["ORACLE_HOME"] + os.pathsep + os.environ["PATH"]
复制代码


将 C:\oracle\instantclient_11_2 替换为您的 Oracle 客户端库的实际路径。

最后,您可以在程序中检查可用的数据库驱动程序,以确保 QOCI 驱动程序可用。

要检查可用驱动程序,请使用 QSqlDatabase.drivers() 方法:

  1. from PyQt5.QtSql import QSqlDatabase

  2. available_drivers = QSqlDatabase.drivers()
  3. print("Available drivers:", available_drivers)
复制代码


如果 QOCI 驱动程序可用,它应该在输出的驱动程序列表中。

请按照这些步骤检查和解决驱动程序未加载的问题。

如果问题仍然存在,请提供有关您的系统配置和 Qt 安装的更多详细信息,以便我们可以更好地帮助您解决问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-13 16:37:02 | 显示全部楼层
捣鼓了2天QSqlQuery和QSqlQueryModel的方法没有成功
最终还是退回到遍历填充单元格的办法。不过还是感谢isdkz大神的悉心指导。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 19:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表