1作者: pgjones8 天前原帖
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)。我今年一直在这样做,欢迎您的想法和反馈。
1作者: zhxwork8 天前原帖
在HarmonyOS 5的应用开发和测试过程中,频繁安装和更新测试包是常见需求。本文介绍了如何使用自动化批处理脚本(`install_v1.0.1.bat`)快速卸载、安装和启动HarmonyOS 5应用,从而显著提高开发和测试效率。