不带引号的SQL.IDENTIFIER
问题描述
我在Web上搜索了"不带引号的SQL.IDENTIFIER",而this post只是相关的。建议使用.format(sql.Identifier
。
然而,该方法将双引号添加到标识符中,并且据我所知,它不能用于在PostgreSQL中使用不带引号的标识符。正如我在here中读到的那样,专家建议不要在postgres中引用标识符。
我在sql.Identifier
中没有看到跳过the document中的引用以及psycopg2
的sql
模块中的替代方法的选项。如何在未加引号的标识符中以注入安全的方式使用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):
可以将多个字符串传递给对象以表示限定的 名称,即以点分隔的标识符序列。
相关文章