Использование формата в двух запросах в sql - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть запрос, который я использую, за исключением. Я хочу отправить путь к таблице в формате при выполнении запроса select.

query_2="""select * 
           from {}.{} 
           where date(etl_date) = current_date 
           except select * 
                  from {}_test.{} 
                  where date(etl_date)=current_date"""
       .format(liste[0],liste[1])

Но, естественно, я получаю такую ​​ошибку.

IndexError: индекс кортежа вне диапазона

Как еще можно использовать функцию форматирования здесь? Спасибо ...

1 Ответ

0 голосов
/ 11 апреля 2020

Не используйте простой формат для SQL запросов; используйте sql .Identifier для таблиц, полей и используйте второй аргумент метода execute для передачи переменных (при необходимости).

from psycopg2.sql import Identifier, SQL
connection = psycopg2.connect("...")
cursor = connection.cursor()
suffix = "_test"
identifiers = [Identifier("some_schema"), Identifier("some_table"), Identifier("other_schema%s" % suffix), Identifier("other_table")]
query_2 = SQL("""select * from {}.{} where date(etl_date) = current_date 
              except select * from {}.{} where date(etl_date)=current_date""").format(*identifiers)
print(query_2.as_string(cursor))  # if you want to see the final query
cursor.execute(query_2)

Output

select * from "some_schema"."some_table" where date(etl_date) = current_date
except select * from "other_schema_test"."other_table" where date(etl_date)=current_date

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

...