不带引号的SQL.IDENTIFIER

2022-04-14 00:00:00 python postgresql psycopg2

问题描述

我在Web上搜索了"不带引号的SQL.IDENTIFIER",而this post只是相关的。建议使用.format(sql.Identifier

然而,该方法将双引号添加到标识符中,并且据我所知,它不能用于在PostgreSQL中使用不带引号的标识符。正如我在here中读到的那样,专家建议不要在postgres中引用标识符。

我在sql.Identifier中没有看到跳过the document中的引用以及psycopg2sql模块中的替代方法的选项。如何在未加引号的标识符中以注入安全的方式使用Python中的PostgreSQL?

补充道:我的困惑是因为我使用了"Public.abc"来表示SQL.IDENTIFIER,而在@Klin的回答中,我应该使用两个标识符。整理好后,我发现引号仅用于区分大小写(和/或使用点等其他符号)。


解决方案

您应该区分两种不同的情况。如果要在区分大小写的标识符中使用大写字母,必须使用双引号。如果您只使用小写字母作为标识符,可以,但不必使用双引号。专家通常建议避免第一种情况。在第二种情况下,opecpg2自动添加的引号不是问题。

请注意,public.abc不是,它是包含两个标识符的表达式。因此,您应该这样使用它:

sql.SQL("select * from {}.{}").format(sql.Identifier(schema_name), sql.Identifier(table_name))

或此:

sql.SQL("select * from {}").format(sql.Identifier(schema_name, table_name))

AS(Perthe documentation):

可以将多个字符串传递给对象以表示限定的 名称,即以点分隔的标识符序列。

相关文章