LINUX.ORG.RU

psycopg2 не может работать со схемой «validate»

 , ,


0

2

Продолжаю разбираться в связке PostgreSQL+Python+psycopg2.

Вот код, который создает схему our_scheme и создает таблицу в этой схеме:

# Подключение к БД с заданными параметрами
connection = psycopg2.connect(**pgConnectionParameters)
cursor = connection.cursor()

# Переключение на заданную схему
dbSchema = 'our_schema'
cursor.execute("CREATE SCHEMA IF NOT EXISTS %s" % dbSchema)
cursor.execute("SET search_path TO %s" % dbSchema)

# Проверка текущей схемы
cursor.execute("SHOW search_path;")
result = cursor.fetchone()
print( result )

# Создание таблицы
cursor.execute("CREATE TABLE IF NOT EXISTS our_table (id varchar(128) UNIQUE, name varchar(128))")

Все прекрасно работает. Но теперь берем и меняем название схемы:
dbSchema = 'our_schema'
на
dbSchema = 'validate'

И код резко перестает работать. Появляется ошибка:
$ ./sample.py
('validate',)
Traceback (most recent call last):
  File "./sample.py", line 31, in <module>
    cursor.execute("CREATE TABLE IF NOT EXISTS our_table (id varchar(128) UNIQUE, name varchar(12
8))")

psycopg2.ProgrammingError: ОШИБКА: схема для создания объектов не выбрана
LINE 1: CREATE TABLE IF NOT EXISTS our_table (id varchar(128) UNIQUE...

Я проверяю те же самые команды в чистой консоли psql - все работает, схема validate создается, в ней создается таблица.

Но почему-то эти же команды через psycopg2 выдают ошибку.

Почему так?

★★★★★

Последнее исправление: Xintrea (всего исправлений: 1)

Ответ на: комментарий от Xintrea

еще раз – я хз, является ли validate ключевым словом для pgsql. Правильный вариант у них даже в документации написан

>>> cur.execute("INSERT INTO %s VALUES (%s)", ('numbers', 10))  # WRONG
>>> cur.execute(                                                # correct
...     SQL("INSERT INTO {} VALUES (%s)").format(Identifier('numbers')),
...     (10,))

Явно запрещают прямое форматирование.

demidrol ★★★★★
()
Ответ на: комментарий от Xintrea

ну ты же творишь в коде всякую дичь. Я высказал предположение, что ‘validate’ может где-то оказаться ключевым словом (в смысле, где-то потребуется его экранировать). Короче, изучай и наслаждайся, как здоровые люди делают

https://www.psycopg.org/docs/sql.html#module-psycopg2.sql

demidrol ★★★★★
()
Ответ на: комментарий от Xintrea

Анон прав, а ты учи английский. Давай я тебе процитирую прямо с той ссылки

As a general rule, if you get spurious parser errors for commands that use any of the listed key words as an identifier, you should try quoting the identifier to see if the problem goes away.

Можешь воспользоватся гугл/яндекс переводчиком или попросить чат гопоту перевести это на русский и перефразировать так чтоб тебе было понятно.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Анон прав, а ты учи английский.

Ты смотришь в книгу, а видишь фигу вместе со своими знаниями английскага.

Давай я тебе процитирую прямо с той ссылки

Давай я тебе дам ссылку на мою прошлогоднюю статью:

Как правильно использовать разный регистр букв и кавычки в именах объектов PostgreSQL?

Можешь посмотреть там на пример с таблицей select. А теперь найди отличия между ключевым словом select и validate:

Key Word        PostgreSQL
VALIDATE        non-reserved
SELECT          reserved

Xintrea ★★★★★
() автор топика