LINUX.ORG.RU

psycopg2 не имеет элемент sql?

 , , ,


0

1

Использую Astra Linux 1.6

Установлен пакет python3-psycopg2 версии 2.6.2-1.

Пишу минимальный код:

#!/usr/bin/python3

import sys
import enum

from psycopg2 import connect
from psycopg2 import sql

И при запуске вижу ошибку:
Traceback (most recent call last):
  File "./sample_import.py", line 7, in <module>
    from psycopg2 import sql
ImportError: cannot import name 'sql'

То есть, connect импортируется нормально, а sql - нет.

Это потому что кривая (старая) библиотека, как у этого товарища: https://github.com/OCA/openupgradelib/issues/193
Похоже, что SQL string composition появилось только в версии 2.7?

А как же тогда раньше генерировали безопасные запросы, которые имеют динамические имена объектов БД? (Имеется в виду именно динамические имена объектов БД а не представление данных, пишущихся в БД).

Получается, что все что написано здесь:
https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries
и здесь:
https://www.psycopg.org/docs/sql.html
в моем случае неприменимо, т. к. система сертифицирована и замена пакетов не допускается.

Получается, что технотролли здесь:
psycopg2 генерирует неправильные команды для комментариев и схем
и здесь
psycopg2 не может работать со схемой «validate»
зря выплясывали, потому что я даже не могу увидеть то о чем идет речь, не говоря уже о том чтобы воспользоваться.

★★★★★

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

в моем случае неприменимо, т. к. система сертифицирована и замена пакетов не допускается.

твою поделку тоже не забудь сертифицировать

peregrine ★★★★★
()

А как же тогда раньше генерировали безопасные запросы, которые имеют динамические имена объектов БД?

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

Что касается старой версии, обычно используют отдельный venv под каждое приложение.

masa
()
Ответ на: комментарий от cobold

По моему создавать новый пост было лишним, ведь вопрос в нем дублирует вопрос в предыдущем

Так ТС тормоз, с первого раза не понимает.

anonymous
()
Ответ на: комментарий от masa

Да почему пользователем то вводится? Вот смотри, надо тебе сделать что-то типа pg_dump. Первым запросом ты получаешь список таблиц в базе, а дальше в цикле проходишь по резальтсету и для каждой таблицы делаешь show create table %s.%s

Смутно вспоминая предыдущие топики оп-куна у него там вроде была идея в комментарии к таблице хранить какую-то мету, версию схемы чтоль. С целью накатывания и откатывания миграций

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

Не нужно формат. F строки удобнее и даже быстрее чем .format

Правда нужно тогда внимательно смотреть на то что туда подставляется, если оно генерируется, чтоб случайно не могло сгенерироваться ключевых слов или кода который может выполниться. Да, я такое видел, когда ключевые слова генерировались (можно встретить такое когда postgresql используется для обработки данных вместо условного пандаса потому как postgresql с 8 гигами оперативки под процесс шустро переваривает такой объем данных, на которые пандасу даже при всех ужимках разработчика 128 гигов мало, а данные загружаются самим разработчиком из какого-нибудь csv/tsv/экселя или чего-то аналогичного), т.к. там могут быть интересные названия столбцов, например.

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

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

anonymous
()
Ответ на: комментарий от peregrine

Не нужно формат. F строки удобнее и даже быстрее чем .format

Ага, начиная с версии 3.6. Попробуй сделать то же самое в моей, конечно же сертифицированной, 3.5.3.

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

psycopg2.extensions есть? Если да, то можешь использовать оттуда quote_ident.

Такого пакета нет.

Есть файл /usr/lib/python3/dist-packages/psycopg2/extensions.py.

Но в нем ничего похожего нет:

> cat /usr/lib/python3/dist-packages/psycopg2/extensions.py | grep quote_ident
Пусто

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

3.5.3

В целом ситуация с сертификацией понятна, но… Версии третьего python’а до 3.7 были неюзабельны - потеря совместимости, ошибки и малое количество новых полезных фичей. Их не использовал примерно никто, и никакие версии популярных библиотек никто под них не поддерживал примерно никогда (на 3.4-3.6 проекты активно мигрировали в сумме несколько лет, но большая часть библиотек получили нормальную python3 совместимость только к концу этого периода). Версия 3.7 - тоже уже год как не имеет поддержки. Обновляйтесь на новую версию дистрибутива, если там есть более свежий питон. Это всё что можно конструктивно посоветовать в рамках тредов на ЛОРе в текущей ситуации.

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

И ещё кажется что любой несертифицированный код в системе лишает систему сертификации, так что в целом не очень понятно зачем это всё.

Не лишает, если разрабатывается код, который так же проходит сертификацию.

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