我想执行一些原始 SQL 并利用 SQLAlchemy 的 SQL 注入(inject)预防。
我的代码与此类似:
import sqlalchemy
from sqlalchemy.sql import text
DB_URI = '...'
engine = sqlalchemy.create_engine(DB_URI)
sql = text("SELECT * FROM some_table WHERE userid = :userid")
res = engine.execute(sql, userid=12345)
# do something with the result...
问题是 some_table
中的 userid
是 varchar
类型。我想要做的就是告诉 SQLAlchemy 在执行语句之前将 12345
转换为字符串。我知道如何在 Python 和 SQL 中进行转换。但是我记得我曾经在 SQLAlchemy 中使用过显式类型定义,只是找不到了。有人能指出我正确的方向吗?
(我的实际问题涉及 BIGINT 与 INT 的 postgresql 数组,但我尽量保持简单。)
感谢您的帮助!
最佳答案
这个问题已经有点老了,但了解我自己,我以后可能会回来找这个问题。 这是我正在寻找的代码:
import sqlalchemy
from sqlalchemy.sql.expression import bindparam
from sqlalchemy.types import String
from sqlalchemy.dialects.postgresql import ARRAY
DB_URI = '...'
engine = sqlalchemy.create_engine(DB_URI)
sql = text("SELECT * FROM some_table WHERE userid = :userid").bindparams(bindparam("userid", String))
res = engine.execute(sql, userid=12345)
# in particular this bit is useful when you have a list of ids
sql = text("SELECT * FROM some_table WHERE userids = :userids").bindparams(bindparam("userids", ARRAY(String)))
res = engine.execute(sql, userids=[12345, 12346, 12347])
关于python - 在 SQLAlchemy 原始 SQL 中设置输入参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40879901/