Sql 炼金术报价数据库绑定参数在帖子上



我是sql炼金术的新手。

我有一个postgres本地服务器,我想使用sql alchemy创建一个数据库。

我有以下代码:

connection = engine.connect()
connection.execute(
text("CREATE DATABASE :database_name").bindparams(bindparam('database_name', quote=False)),
database_name="test_db"
)

但不幸的是,这单引号数据库名称参数,这在 postgres 中不起作用。来自sql炼金术的日志:

[SQL: CREATE DATABASE %(database_name)s]
[parameters: {'database_name': 'test_db'}]
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "'test_db'" LINE 1: CREATE DATABASE 'test_db`'

在 postgres 日志中,它执行以下语句,由于单引号,该语句无效。一个有效的应该有双引号:

CREATE DATABASE 'test_db'

有没有办法在结果语句中不引用绑定参数?我不想自己做参数引用和字符串创建,因为我认为这种抽象应该由 sql alchemy 处理 - 以防我更改我的底层数据库引擎,例如,这似乎是 sql alchemy 促进避免 sql 注入的机制。

同样的问题也适用于其他 postgres 语句,例如使用密码创建用户或向现有用户授予权限,这些语句都需要引用特定于 postgres 的引用。

在语句中不能有参数,除了SELECTINSERTUPDATEDELETE之外。

您必须将CREATE DATABASE语句构造为包含数据库名称的字符串。类似的东西

from psycopg2 import sql
cursor.execute(
sql.SQL("CREATE DATABASE {}").format(sql.Identifier('test_db'))
)

最新更新