python - 在 SQLAlchemy 原始 SQL 中设置输入参数类型

标签 python postgresql sqlalchemy

我想执行一些原始 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 中的 useridvarchar 类型。我想要做的就是告诉 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/

相关文章:

python - 选择日期之间的 pandas 数据框行并设置列值

python - 为什么我的smo运行这么慢?

postgresql - 如何 pg_restore

python - SQLAlchemy 在 PostgresQL 中创建 View

python - sqlalchemy 使列遵循规则的关系

python - 在 Pandas DF 行中查找最小日期并创建新列

python - 读取 CSV 并绘制彩色折线图

python - django.db.utils.OperationalError : FATAL: password authentication failed for user "postgres"

python - Django运行时警告: DateTimeField received a naive datetime

python - SQLAlchemy 嵌套模型创建单行