You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt6.QtSql中QSqlQuery执行CREATE TABLE无效果问题求助

问题解决:PyQt6 QSqlQuery创建PostgreSQL表无效果

核心原因

PostgreSQL是事务型数据库,PyQt6的QSqlDatabase默认不开启自动提交,执行CREATE TABLE这类DDL语句后,若未手动提交事务,连接关闭时事务会自动回滚,导致表无法创建。此外,未显式传递数据库连接给QSqlQuery可能引发警告,同时增加隐式错误风险。

修正后的代码

import sys
from PyQt6.QtSql import QSqlDatabase, QSqlQuery

con = QSqlDatabase.addDatabase('QPSQL')
con.setDatabaseName('test')

if not con.open('test', 'test'):
    print("数据库连接失败!")
    print(con.lastError().text())
    sys.exit(1)

# 显式将数据库连接传入QSqlQuery,避免隐式依赖默认连接
query = QSqlQuery(con)

create_sql = """
CREATE TABLE contacts(
    id serial primary key,
    name varchar(40) not null,
    job varchar(50),
    email varchar(40) not null
)
"""

# 执行语句并检查结果
if not query.exec(create_sql):
    print("创建表失败:")
    print(query.lastError().text())
else:
    # 提交事务,确保DDL操作生效
    con.commit()
    print("表创建成功")

print("当前数据库表列表:", con.tables())

# 关闭数据库连接
con.close()

关键修改点

  • 显式传递数据库连接:创建QSqlQuery时传入con,既消除了invalid nullptr parameter警告,也避免了隐式使用默认连接可能带来的问题。
  • 检查执行结果:通过query.exec()的返回值判断操作是否成功,并用query.lastError()获取具体错误信息,方便排查问题。
  • 手动提交事务:执行DDL语句后调用con.commit(),确保操作被持久化到数据库。如果不需要事务控制,也可以提前设置con.setAutoCommit(True)开启自动提交,省去手动调用commit()的步骤。

补充说明

  • 之前SELECT语句能正常返回结果,是因为只读查询不需要提交事务即可获取数据。
  • pgAdmin中执行CREATE语句成功,是因为pgAdmin默认会自动提交每个执行的语句。

内容的提问来源于stack exchange,提问作者Farshid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:08:25