Python postgres上的Sql alchemy quote数据库绑定参数

Python postgres上的Sql alchemy quote数据库绑定参数,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我是sql炼金术新手 我有一个postgres本地服务器,我想使用sql alchemy创建一个数据库 我有以下代码: connection = engine.connect() connection.execute( text("CREATE DATABASE :database_name").bindparams(bindparam('database_name', quote=False)), database_name="test_db" ) 但不幸的是,这个单引号引用

我是sql炼金术新手

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

我有以下代码:

connection = engine.connect()
connection.execute(
    text("CREATE DATABASE :database_name").bindparams(bindparam('database_name', quote=False)),
    database_name="test_db"
)
但不幸的是,这个单引号引用了database name参数,这在postgres中不起作用。sql alchemy的日志:

[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'
有没有办法在结果语句中不引用bind参数?我不想自己做参数引用和字符串创建,因为我认为这个抽象应该由sql alchemy来处理——以防我为eg更改了基础数据库引擎,而这看起来也是sql alchemy为避免sql注入而促进的机制


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

除了
SELECT
INSERT
UPDATE
DELETE
之外,语句中不能有其他参数

您必须将
createdatabase
语句构造为包含数据库名称的字符串。差不多

从psycopg2导入sql
cursor.execute(
sql.sql(“创建数据库{}”).format(sql.Identifier('test_db'))
)

我得到了一个“sqlalchemy.exc.ObjectNotExecutableError:不是一个可执行对象:组合([SQL('CREATE DATABASE')、Identifier('test_db'))]”。我也在寻找可以跨其他数据库工作的东西,这样,如果我改为Mysql或SqlServer,我就不必更改导入和使用其他东西<代码>光标应为psycopg2光标
createdatabase
绝对不是一条适用于所有RDBMS的语句。它甚至不在标准中。如果它起作用,在不同的RDBMS中意味着完全不同的东西。这不是SQLAlchemy解决方案,而是DB-API,
pyscopg2
,解决方案。此外,没有两个RDBMS是相同的,便于互换。我也不会在应用层脚本(如Python)中动态创建数据库。数据库、架构、用户等应该是计划的、手动的、一次性的事件,而不是在代码中运行。请重新考虑您的数据库设计和/或项目需要<代码>创建数据库是一个强大的语句,因为它设置了整个内部结构。虽然您的目标是针对SQL注入的最佳实践,但出于安全性和持久性的原因,您还应该注意正确的设计,而不是在应用程序层构建数据库。