При получении результатов из базы данных в 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)