在psycopg2的execute()中传递变量数据库名称

时间:2018-02-13 00:45:07

标签: python postgresql psycopg2

这就是我所拥有的:

    db_name = 'temp_test_database'
    conn.set_isolation_level(0)
    cursor.execute('DROP DATABASE IF EXISTS {}'.format(db_name))

此功能有效并符合我的预期,但违反了传递rule的参数。

我查看了SQL string composition documentation,但这不适用于数据库名称。它用“Identifier()”包装它,它会破坏。

是否有“干净”的方法在psycopg2执行调用中动态设置数据库?

2 个答案:

答案 0 :(得分:0)

使用psycopg2.sql.Identifier并像这样编写SQL语句:

from from psycopg2 import sql

cursor.execute(sql.SQL("drop database if exists {}")
    .format(sql.Identifier(db_name)))

整个链接的文档页面值得一读。

答案 1 :(得分:0)

诀窍是使用as_string(),将光标用作上下文。参见docs about this method

这里有一个完整的工作片段:

import psycopg2
from psycopg2 import sql

conn = psycopg2.connect(dbname="postgres")
conn.set_isolation_level(0)
cursor = conn.cursor()
db_name = sql.Identifier("temp_test_database").as_string(cursor)
cursor.execute('DROP DATABASE IF EXISTS {}'.format(db_name))
...