我正在使用 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 |
---|
|
我不想这样。我希望能够捕获这样一个准备不当的查询并告诉用户。
我如何知道我的查询是否设置正确,并且每个指定占位符的值都受到限制?
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% 匹配。