首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgres上的Sql炼金术引号数据库绑定参数

postgres上的Sql炼金术引号数据库绑定参数
EN

Stack Overflow用户
提问于 2019-10-03 13:41:02
回答 1查看 1.3K关注 0票数 1

我对sql炼金术很陌生。

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

我有以下代码:

代码语言:javascript
复制
connection = engine.connect()
connection.execute(
    text("CREATE DATABASE :database_name").bindparams(bindparam('database_name', quote=False)),
    database_name="test_db"
)

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

代码语言:javascript
复制
[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日志中,它执行以下语句,由于单引号,该语句无效。有效的单引号应该是双引号:

代码语言:javascript
复制
CREATE DATABASE 'test_db'

是否有一种方法在结果语句中不引用bind参数?我不想自己做参数引用和字符串创建,因为我认为这个抽象应该由sql炼金术来处理--以防我将底层数据库引擎更改为例如,这看起来也是sql炼金术为避免sql注入而提倡的机制。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-03 14:09:58

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

您必须将CREATE DATABASE语句构造为包含数据库名称的字符串。有点像

代码语言:javascript
复制
from psycopg2 import sql

cursor.execute(
    sql.SQL("CREATE DATABASE {}").format(sql.Identifier('test_db'))
)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58220421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档