python - SQLAlchemy 参数化未引用的值
问题描述
我正在尝试在数据库中动态创建用户,如下所示:
from sqlalchemy.sql import text
def create_user(user: str, password: str):
stmt = text("CREATE USER :user WITH PASSWORD :password")
engine.execute(stmt, user=user, password=password)
create_user("bob", "password123")
但问题在于 SQLAlchemy 会将这个查询参数化为:
CREATE USER 'bob' WITH PASSWORD 'password123'"
这会引发错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "'bob'"
LINE 1: CREATE USER 'bob' WITH PASSWORD 'password123'
抛出此错误是因为bob
应该不加引号。正确的 SQL 输出实际上应该是:
CREATE USER bob WITH PASSWORD 'password123'
如何防止 SQLAlchemy 将参数化值包含在引号中?
解决方案
在标准查询参数化不适用的情况下,例如尝试将数据库对象名称合并到 SQL 语句中时,我们必须求助于动态 SQL:
with engine.begin() as conn:
sql = "CREATE USER {} WITH PASSWORD {}".format("bob", "password123")
conn.exec_driver_sql(sql)
(显然,必须小心避免 Little Bobby Tables 的访问。)
推荐阅读
- r - 来自数据框的堆积条形图
- pyspark - pyspark数据框检查字符串是否包含子字符串
- assembly - “byte ptr X”作为 TASM 中的操作数?
- python - Pylab get_patch() 给出属性错误
- python - 根据同一行中的值提取单个值(熊猫)
- google-apps-script - 想添加电子邮件发送功能,以防我的临时工超过 8 个
- reactjs - 重定向到 Next.js 中的不同页面时如何触发硬刷新?
- python - 不和谐循环出错,通道发送
- php - Laravel Format AllDirectories() 输出到树中
- reactjs - 将 google 字体链接添加到样式化组件 createGlobalStyle