返回首页
最新
SQL-tString 是一个 SQL 构建器,利用最近通过的 PEP-750 中的 t-strings 来构建 SQL 查询。例如:
```python
from sql_tstring import sql
val = 2
query, values = sql(t"SELECT x FROM y WHERE x = {val}")
assert query == "SELECT x FROM y WHERE x = ?"
assert values == [2]
db.execute(query, values) # 大多数数据库引擎支持这种用法
```
占位符 ? 可以防止 SQL 注入,但并非在所有地方都能使用。例如,列名不能作为占位符。如果尝试这样做,SQL-tString 将抛出错误:
```python
col = "x"
sql(t"SELECT {col} FROM y") # 抛出 ValueError
```
要继续进行,您需要声明 col 的有效值是什么:
```python
from sql_tstring import sql_context
with sql_context(columns="x"):
query, values = sql(t"SELECT {col} FROM y")
assert query == "SELECT x FROM y"
assert values == []
```
这样可以保护您免受 SQL 注入的攻击。
由于 t-strings 是格式字符串,您可以安全地格式化您希望作为变量传递的字面量:
```python
text = "world"
query, values = sql(t"SELECT x FROM y WHERE x LIKE '%{text}'")
assert query == "SELECT x FROM y WHERE x LIKE ?"
assert values == ["%world"]
```
这在与 Absent 重写值一起使用时尤其有用。
SQL-tString 是一个 SQL 构建器,因此您可以使用特殊的 RewritingValues 在运行时修改和构建所需的查询。最好的例子是考虑一个查询,有时您想按列 a 搜索,有时按 b 搜索,有时两者都要:
```python
def search(
*,
a: str | AbsentType = Absent,
b: str | AbsentType = Absent
) -> tuple[str, list[str]]:
return sql(t"SELECT x FROM y WHERE a = {a} AND b = {b}")
assert search() == "SELECT x FROM y", []
assert search(a="hello") == "SELECT x FROM y WHERE a = ?", ["hello"]
assert search(b="world") == "SELECT x FROM y WHERE b = ?", ["world"]
assert search(a="hello", b="world") == (
"SELECT x FROM y WHERE a = ? AND b = ?", ["hello", "world"]
)
```
具体来说,Absent(它是 RewritingValue.ABSENT 的别名)将移除它所在的表达式,如果移除后没有剩余的表达式,它还会移除该子句。
我包含的其他重写值处理了比较 NULL 的棘手情况,例如,以下代码是有效的,但可能不会按您预期的那样工作:
```python
optional = None
sql(t"SELECT x FROM y WHERE x = {optional}")
```
相反,您可以使用 IsNull 来获得正确的结果:
```python
from sql_tstring import IsNull
optional = IsNull
query, values = sql(t"SELECT x FROM y WHERE x = {optional}")
assert query == "SELECT x FROM y WHERE x IS NULL"
assert values == []
```
还有一个 IsNotNull 用于否定比较。
最后一个特性允许通过在现有的 t-string 中嵌套另一个 t-string 来构建复杂的查询:
```python
inner = t"x = 'a'"
query, _ = sql(t"SELECT x FROM y WHERE {inner}")
assert query == "SELECT x FROM y WHERE x = 'a'"
```
这个库可以在没有 Python 3.14 的 t-strings 的情况下使用,虽然有一些限制,您可以查看 [这里](https://github.com/pgjones/sql-tstring?tab=readme-ov-file#pre-python-314-usage)。我今年一直在这样做,欢迎您的想法和反馈。
在HarmonyOS 5的应用开发和测试过程中,频繁安装和更新测试包是常见需求。本文介绍了如何使用自动化批处理脚本(`install_v1.0.1.bat`)快速卸载、安装和启动HarmonyOS 5应用,从而显著提高开发和测试效率。