psycopg2 标识符中的模式名称

Max*_*Max 5 python postgresql psycopg2

我想用psycopg2的sql子模块来写干净的动态SQL:

from psycopg2 import sql
...
cursor.execute(sql.SQL("SELECT * FROM {}").format(sql.Identifier('myschema.mytable'))
Run Code Online (Sandbox Code Playgroud)

这将创建以下查询:

SELECT * FROM "myschema.mytable"
Run Code Online (Sandbox Code Playgroud)

在这里我得到一个Relation "myschema.mytable" not found.例外。

如何正确处理架构名称?以下语句可以工作,但如何使用 psycopg2 创建它们?

SELECT * FROM myschema.mytable
SELECT * FROM myschema."mytable"
SELECT * FROM "myschema"."mytable"
Run Code Online (Sandbox Code Playgroud)

编辑:澄清架构前缀

Ilj*_*ilä 9

那个工程

sql.Identifier('myschema.mytable')
Run Code Online (Sandbox Code Playgroud)

被视为单引号标识符,从生成的查询中可以看出。您应该将架构和表名作为单独的标识符传递以进行格式化:

cursor.execute(sql.SQL("SELECT * FROM {}.{}").format(
    sql.Identifier('myschema'),
    sql.Identifier('mytable'))
Run Code Online (Sandbox Code Playgroud)

请注意,模式和表名必须完全匹配,大小写和全部匹配,因为psycopg2SQL 字符串组合工具生成带引号的标识符,并且带引号的标识符区分大小写。