execute_values с инструкцией SELECT

#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 , и запрос действительно проходит и возвращает то, что я хочу. Но это именно то, как мне рекомендовали это сделать. Если у вас есть лучший способ написать это только с помощью a cur.execute , я был бы признателен! Я пытался сделать это таким образом, но я продолжал получать синтаксические ошибки, так что это просто моя неопытность в SQL…

4. Каковы были синтаксические ошибки?

5. Если я выполняю точно такой же запрос (с FULL OUTER JOIN ), как cur.execute(query_string, data) тогда, я получаю not all arguments converted during string formatting