使用 PostgreSQL 捕获 QtSQL 中未绑定的命名占位符

问题描述 投票:0回答:1

我正在使用 PyQt5 和 PostgreSQL 数据库。

https://doc.qt.io/qt-5/qsqlquery.html#approaches-to-binding-values

如果我在查询中使用位置占位符并且未将值绑定到它们,查询执行将失败:

query.prepare("INSERT INTO t (id) VALUES (?);")
# missing bind values here
query.exec()
print(query.lastError().text())

->

ERROR:  wrong number of parameters for prepared statement "qpsqlpstmt_1"
DETAIL:  Expected 1 parameters but got 0.
(42601) QPSQL: Unable to create query

这很好,因为它可以发现错误。 不过我想使用命名占位符。

如果我在查询中使用命名占位符并且未将值绑定到它们,则查询执行将不会失败。相反,将使用

NULL
值。

query.prepare("INSERT INTO t (id) VALUES (:foo);")
# missing bind values here
query.exec()
id
NULL

我不想这样。我希望能够捕获这样一个准备不当的查询并告诉用户。

我如何知道我的查询是否设置正确,并且每个指定占位符的值都受到限制?

postgresql pyqt prepared-statement qtsql
1个回答
0
投票

query.boundValues()
是占位符/参数的字典,所有
None
在您实际绑定值之前。例如:
{":parameter1": None, ":parameter2": None, ...}

我的 API 用户现在必须传递具有相同结构的字典及其想要的值,例如:

{":parameter1": 42, ":parameter2": None, ...}

绑定是在我的 API 的函数中完成的,它使用设置比较检查查询占位符和传递的数据之间的匹配参数:

missing_values = set(query.boundValues().keys()).difference(values_to_bind.keys())
if missing_values:
    raise ValueError(f"Missing input for named placeholder(s): {missing_values}")
missing_placeholders = set(values_to_bind.keys()).difference(query.boundValues().keys())
if missing_placeholders:
    raise ValueError(f"Missing placeholder(s) for passed value(s): {missing_placeholders}")

这样我就可以确保查询中的命名占位符与实际绑定值之间 100% 匹配。

© www.soinside.com 2019 - 2024. All rights reserved.