首页 > 解决方案 > 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 将参数化值包含在引号中?

标签: pythonpostgresqlsqlalchemy

解决方案


在标准查询参数化不适用的情况下,例如尝试将数据库对象名称合并到 SQL 语句中时,我们必须求助于动态 SQL

with engine.begin() as conn:
    sql = "CREATE USER {} WITH PASSWORD {}".format("bob", "password123")
    conn.exec_driver_sql(sql)

(显然,必须小心避免 Little Bobby Tables 的访问。)


推荐阅读