#python #sql #python-3.x #psycopg2
#python #sql #python-3.x #psycopg2
Вопрос:
Я использую объединение таблиц, чтобы выбирать элементы из моей базы данных по списку кортежей параметров. Запрос работает нормально, но cur.fetchall()
не возвращает всю таблицу, которую я хочу.
Например:
data = (
(1, '2020-11-19'),
(1, '2020-11-20'),
(1, '2020-11-21'),
(2, '2020-11-19'),
(2, '2020-11-20'),
(2, '2020-11-21')
)
query = """
with data(song_id, date) as (
values %s
)
select t.*
from my_table t
join data d
on t.song_id = d.song_id and t.date = d.date::date
"""
execute_values(cursor, query, data)
results = cursor.fetchall()
На практике мой список кортежей для проверки состоит из тысяч строк, и я ожидаю, что ответ также будет длиной в тысячи строк.
Но я получаю только 5 строк обратно, если я вызываю cur.fetchall()
в конце этого запроса.
Я знаю, что это связано execute_values
с тем, что запросы обрабатываются пакетами, но есть какое-то странное поведение.
Если я пройду page_size=10
, я получу 2 элемента обратно. И если я установлю fetch=True
, я вообще не получу никаких результатов (даже если rowcount
это не соответствует этому).
Я думал, что нужно выполнить эти запросы, но page_size
для пакета не соответствует количеству элементов, которые я ожидаю для каждого пакета.
Как мне изменить этот запрос, чтобы я мог получить все ожидаемые результаты?
Комментарии:
1. Что произойдет, если вы выполните
outer join
?2. Кроме того, я не думаю, что понимаю, почему вы все
execute_values
равно используете here . Это помогает при пакетных вставках, но я не думаю, что это что-то делает для выбора?3. Я добавил
FULL OUTER JOIN
, и запрос действительно проходит и возвращает то, что я хочу. Но это именно то, как мне рекомендовали это сделать. Если у вас есть лучший способ написать это только с помощью acur.execute
, я был бы признателен! Я пытался сделать это таким образом, но я продолжал получать синтаксические ошибки, так что это просто моя неопытность в SQL…4. Каковы были синтаксические ошибки?
5. Если я выполняю точно такой же запрос (с
FULL OUTER JOIN
), какcur.execute(query_string, data)
тогда, я получаюnot all arguments converted during string formatting