Show HN: 使用 Python 构建 t-string 风格 SQL 的 SQL-tString
SQL-tString 允许使用类似 f-string 的方式构造 SQL 查询,而无需担心 SQL 注入的风险。基本用法如下:
from sql_tstring import sql
a = 1
query, values = sql(
t"""SELECT a, b, c
FROM tbl
WHERE a = {a}""",
)
query
是一个 str
类型,values
是一个 list[Any]
类型,通常都会将它们传递给数据库连接。 注意,参数只能是标识变量的标识符(在上面的例子中是 locals() 中的变量),例如 {a - 1}
是无效的。
SQL-tString 会将参数转换为适当的 SQL 占位符。在其他情况下,SQL-tString 允许使用预定义的列名或表名,例如:
from sql_tstring import sql, sql_context
col = "a"
table = "tbl"
with sql_context(columns={"a"}, tables={"tbl"}):
query, values = sql(
t"SELECT {col} FROM {table}",
)
如果 col
或 table
的值与提供给 sql_context
函数的有效值不匹配,则会引发错误。
重写值
如果将参数设置为特殊值 Absent
(或 RewritingValue.Absent
),SQL-tString 也会移除这些参数。 这对于可选更新或条件语句非常有用:
from sql_tstring import Absent, sql
a = Absent
b = Absent
query, values = sql(
t"""UPDATE tbl
SET a = {a},
b = 1
WHERE b = {b}""",
)
由于 a
和 b
都是 Absent
,因此上面的 query
将会是 UPDATE tbl SET b =1
。
此外,对于条件语句,可以使用 IsNull
(或 RewritingValue.IS_NULL
)和 IsNotNull
(或 RewritingValue.IS_NOT_NULL
)来按预期重写条件。这很有用,因为 x = NULL
在 SQL 中始终为 false。
Paramstyle (dialect)
默认情况下,SQL-tString 使用 qmark
paramstyle (dialect),但也支持 $
paramstyle 或 asyncpg
dialect。 最好通过以下方式全局更改:
from sql_tstring import Context, set_context
set_context(Context(dialect="asyncpg"))
Python 3.14 之前的版本的使用方法
t-strings 是在 Python 3.14 中通过 PEP 750 引入的。但是,这个库可以与 Python 3.12 和 3.13 一起使用,如下所示:
from sql_tstring import sql
a = 1
query, values = sql(
"""SELECT a, b, c
FROM tbl
WHERE a = {a}""",
locals(),
)
请注意,只有简单的变量标识符才能放置在大括号内。
关于
SQL-tString 允许使用类似 f-string 的方式构造 SQL 查询。
主题
资源
许可证
Stars
Watchers
Forks
Releases
Packages 0
No packages published