Я запрашиваю базу данных postgres, используя python / pandas с sqlalchemy. У меня есть запрос sql, который выглядит так:

    SELECT table_name
    FROM fixed_602fcccd0f189c2434611b14.information_schema."tables" t 
    WHERE table_type='BASE TABLE'
    and table_schema='di_602fccd10f189c2434611be9'
    and (
    table_name like 'general_journal%'
    or table_name like 'output_journal_line%'
    or table_name like 'output_journal_tx%'
    or table_name like 'flats%'
    )

Я тестировал его в dBeaver, и он отлично работает. Теперь я пытаюсь передать тот же запрос через pandas read_sql следующим образом:

from_string = pg_db + '.information_schema."tables"'
print(from_string)
pg_query = queries.id_tables.format(from_string,di_id)

Идея состоит в том, что я создаю запрос с переменными pg_db (строка) и di_id (строка), когда я делаю серию запросов. Проблема в том, что запрос возвращает пустой массив, когда это сделано таким образом. Ошибка не возникает.

Я подозревал, что проблема заключается в атрибуте «таблицы», который, когда pandas интерпретирует запрос, например. убирает ", но на самом деле это не имеет значения. Есть мысли о том, как заставить это работать с пандами?

ОБНОВЛЕНИЕ: я пробовал параметризовать и столкнулся с той же проблемой. Кажется, это сводится к тому, что параметр FROM передается в двойных кавычках. Я попытался удалить их, но похоже, что панды все равно их добавляют. В принципе, двойные кавычки должны подходить согласно документации postgres, но, похоже, это не так даже при выполнении запроса в dBeaver. Если я передам запрос через pandas, как написано в верхней части этого сообщения, нет проблем. Проблема в том, что когда я пытаюсь использовать переменные для параметров FROM и table_schema, я получаю синтаксические ошибки.

1
MikeB2019x 20 Фев 2021 в 18:13

2 ответа

Лучший ответ

Оказывается, проблема исчезла, когда я убрал круглые скобки, заключенные в операторы «или». Я думаю, что сообщение состоит в том, чтобы обратить внимание на то, как вы строите запрос, например. сформировать и объединить все строки и переменные перед их передачей пандам.

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

0
MikeB2019x 22 Фев 2021 в 20:23

Сначала я бы посоветовал вам использовать параметризованный запрос для ввода, но в некоторых случаях проще использовать встроенную функцию repr()

s = "SQL sometimes likes \"here\" and %s \"now\" problems"
print(repr(s))

Дает

'SQL sometimes likes "here" and %s "now" problems'
0
Paul Brennan 20 Фев 2021 в 15:37