удаление таблицы PostgreSQL с кавычками в имени с помощью psycopg2

#python #postgresql #character-encoding #psycopg2

#python #postgresql #кодировка символов #psycopg2

Вопрос:

У меня есть таблица в схеме.

 my_schema.my_table
 

В той же схеме у меня также есть таблица с тем же именем, но со знаками кавычек

 my_schema."my_table"
 

Как я могу удалить my_schema."my_table" с помощью psycopg2?
(без риска падения my_schema.my_table )

Я пробовал:

 postgresConnection = psycopg2.connect(...)
from psycopg2 import sql 

cursor                = postgresConnection.cursor()
name_Table            = 'my_schema."my_table"'
cursor                = postgresConnection.cursor()
dropTableStmt   = "drop TABLE %s;"%name_Table;
cursor.execute(dropTableStmt)
postgresConnection.commit()
cursor.close();
 

Но я получаю

 SyntaxError: zero-length delimited identifier at or near """"
LINE 1: drop TABLE my_schema.""my_table"";
 

Я также пытался:

 from psycopg2 import sql 

cursor                = postgresConnection.cursor()
name_Table            = 'my_schema.""my_table""'
cur = postgresConnection.cursor()
cur.execute(sql.SQL("DROP table {table}").format(table=sql.Identifier(name_Table)))
postgresConnection.commit()
cursor.close();
 

Но тогда я получаю:

 UndefinedTable: table "my_schema.""my_table""" does not exist
 

Комментарии:

1. my_table совпадает с «my_table», если они находятся в одной схеме. В psql do dt my_schema.* для подтверждения.

2.Что касается вашей ошибки в sql.SQL разделе sql class psycopg2.sql.Identifier и sql.Identifier("schema", "table") .

3. по какой-то причине это были разные таблицы. ваш второй комментарий решен, не могли бы вы дать на него ответ?

4. Так my_schema.my_table все еще существует? Если это так, в имени должен быть какой-то скрытый символ. Что произойдет, если вы это сделаете select * from pg_class where relname = 'my_table'; ?

Ответ №1:

Чтобы избежать двойных кавычек в имени объекта, удвойте двойные кавычки:

 DROP TABLE my_schema."""my_table""";