Posgre SQL извлекает массивы в виде кортежей вместо списка, используя psycopg2 - PullRequest
0 голосов
/ 03 марта 2020

При получении результатов из базы данных в psycopg2 значения массива будут возвращены в виде списков. Например, с таблицей my_table, созданной с помощью:

CREATE TABLE my_table AS (
SELECT *
FROM (VALUES
    ('one', 1, ARRAY[1,2,3]),
    ('two', 2, ARRAY[2,3,4]),
    ('three', 3, ARRAY[3,4,5])
) s(eng, num, lst)
)

Это выглядит следующим образом:

eng  |num|lst    |
-----|---|-------|
one  |  1|{1,2,3}|
two  |  2|{2,3,4}|
three|  3|{3,4,5}|

Если таблица выбирается с использованием psycopg2:

from psycopg2 import connect
login = dict(
  host='localhost',
  dbname='my_db',
  user='postgres',
  password='****'
)

with connect(**login) as conn:
  cursor = conn.cursor()
  cursor.execute("SELECT eng,num,list FROM my_table")
  rows = cursor.fetchall()

Переменная rows будет выглядеть следующим образом:

[
    ('one', 1, [1, 2, 3]),
    ('two', 2, [2, 3, 4]),
    ('three', 3, [3, 4, 5])
]

Где столбец lst представляет собой Python list.

Я написал следующее для преобразования любого списка столбцы в кортежи, но мне интересно, есть ли способ заставить курсор читать SQL массивы в виде кортежей вместо списков и, возможно, ускорить процесс.

def force_list_columns_to_tuple(rows):
    list_col_indices = [
        index for index, value in enumerate(rows[0])
        if isinstance(value, list)
    ]

    if len(list_col_indices) > 0:
        for row_index in range(len(rows)):
            row = list(rows[row_index])
            for i in list_col_indices:
                row[i] = tuple(row[i])
            rows[row_index] = tuple(row)

1 Ответ

0 голосов
/ 03 марта 2020

Я написал следующее, чтобы преобразовать любые столбцы списка в кортежи, но мне интересно, есть ли способ заставить курсор читать SQL массивы как кортежи вместо списков

Возможно, что определение вашей собственной функции адаптера psycopg2 или объекта адаптера переопределит встроенную адаптацию между python списками и postgres массивами, хотя у меня есть трудно увидеть значение.

...