Имена схем в идентификаторах psycopg2 - PullRequest
0 голосов
/ 05 июня 2018

Я хочу использовать подмодуль sql psycopg2 для написания чистого динамического SQL:

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

Это создает следующий запрос:

SELECT * FROM "myschema.mytable"

Здесь я получаю исключение Relation "myschema.mytable" not found.,

Как правильно обработать имя схемы?Следующие операторы будут работать, но как мне создать их с помощью psycopg2?

SELECT * FROM myschema.mytable
SELECT * FROM myschema."mytable"
SELECT * FROM "myschema"."mytable"

edit: уточненный префикс схемы

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Конструкция

sql.Identifier('myschema.mytable')

обрабатывается как один заключенный в кавычки идентификатор , как видно из созданного запроса.Вы должны передать схему и имя таблицы в виде отдельных идентификаторов в формате:

cursor.execute(sql.SQL("SELECT * FROM {}.{}").format(
    sql.Identifier('myschema'),
    sql.Identifier('mytable'))

Обратите внимание, что имя схемы и таблицы должны точно соответствовать, case и all, поскольку psycopg2 ' композиция строк SQLинструменты создают идентификаторы в кавычках, а идентификаторы в кавычках чувствительны к регистру.

0 голосов
/ 05 июня 2018

Но таблица в моей базе данных PostgreSQL специально не цитируется.Это означает, что mytable существует, но «mytable» не существует.

Вы неправильно понимаете, что делают кавычки.В вашем случае (то есть без специальных символов в имени таблицы) двойные кавычки делают только то, что они делают имя чувствительным к регистру.Если у вас есть таблица с именем MyTable, то

SELECT * FROM mytable;

работает, потому что она нечувствительна к регистру, а

SELECT * FROM "mytable";

нет, потому что она чувствительна к регистру.Однако

SELECT * FROM "MyTable";

будет работать, и это то, что вы ищете.


Другая проблема (как отметил @ IljaEverilä в комментариях) заключается в следующем:

SELECT * FROM "myschema.mytable"

, который postgres обрабатывает как таблицу с именем myschema.mytable, потому что вы процитировали все это.Я предполагаю, что это то, что вы ищете:

SELECT * FROM "myschema"."mytable"

т.е. вам нужен отдельный идентификатор для схемы и отдельный для таблицы, к которой присоединяется ..

...