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)

я не специалист, конечно. Но разве не запрещено использовать форматирование текста в таких случаях? Это ж огромные ворота для инъекций.

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

Где между этими двумя командами ты увидел пользовательский ввод или поступление данных извне?

dbSchema = 'our_schema'
cursor.execute("CREATE SCHEMA IF NOT EXISTS %s" % dbSchema)

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от demidrol

В топике вопрос совершенно про другое. SQL-инъекции ищи в продакшене а не в минимальном коде который создан чтобы показать ошибку.

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

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

а покажи

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

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

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

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

Команды в топике, можешь повторить.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от 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 ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Ну продолжай страдать. Делов то.

anonymous
()

Можно и другое название для схемы придумать.

anonymous
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.