Продолжаю пытаться использовать библиотеку psycopg2. Проблема подкралась откуда не ждали.
Итак, код написан в соответствии с документацией:
https://www.psycopg.org/docs/usage.html
В которой сказано, что psycopg2 в методе execute() сама делает подстановки в SQL-запрос из переданного кортежа, и делает это правильно. Однако, по факту оказалось, что это не так.
Следующие ошибки демонстрируют, что psycopg2 не понимает где пользовательские данные, а где обращение к объектам. Она просто все подстановки анализирует на переданный базовый Python-тип, и вставляет данные соответственно этому типу. Если это строка - то она будет заключена в одинарные кавычки. Если целое число - будет вставлено число без кавычек.
А что делать, если в кортеже передано имя объекта БД, значение которого не нужно заключать в кавычки? Об этом авторы документации ничего не говорят.
Поэтому, например при использовании комментариев к таблице или при работе со схемами возникают ошибки:
Команды:
cursor.execute( "COMMENT ON TABLE %s IS 'version=%s';", (tableName, tableVersion) )
cursor.execute("CREATE SCHEMA IF NOT EXISTS %s;", (dbSchema,) )
Ошибки:
File "./sample.py", line 205, in setTableVersion
cursor.execute( "COMMENT ON TABLE %s IS 'version=%s';", (tableName, tableVersion) )
psycopg2.ProgrammingError: ОШИБКА: ошибка синтаксиса at or near "'devices'
LINE 1: COMMENT ON TABLE 'devices' IS 'version=12';
^
File "./sample.py", line 89, in connect
cursor.execute("CREATE SCHEMA IF NOT EXISTS %s;", (dbSchema,) )
psycopg2.ProgrammingError: ОШИБКА: ошибка синтаксиса at or near "'service'
LINE 1: CREATE SCHEMA IF NOT EXISTS 'service';
^
В этих командах значения devices и service не должны заключаться в кавычки. Но они заключаются, чем и ломают саму команду.
Вопрос: а как же правильно передавать значения в execute() ?