Как используя минимум ресурсов, при помощи python, sql и библиотек psycopg2 и pandas составить запрос к базе postgre используя данные dataframe?
Как используя минимум ресурсов , при помощи python , sql и библиотек psycopg2 и pandas составить запрос к базе postgre используя данные dataframe загруженные из xlsx файла?
Допустим, есть файл xlsx и табличка с данными в postgre.
Мы можем считать наш excel
df = pd.read_excel( './fail_excel.xlsx', sheet_name='List_1', header=0, index_col=None )
Мы можем подключиться к базе и сделать запрос к нужной нам таблице
cursor.execute("SELECT * FROM types_table")
А теперь задача, как не записывая данные датафрейма в таблицу и не выгружая содержимое из базы данных в датафрейм, составить запрос на основе данных из датафрейма df ?
То есть, сделать что-то такое
for data in df.items():
Select * from types_table t , df (наш датафрейм) where df.data[i] = types_table.id ;
--------------------------------------------------------------
cursor.executemany( "INSERT INTO test_table( id, ecs, value ) VALUES(%s, %s, %s )", df.values.tolist() )
так можно выгрузить данные из датафрейма в табличку... с select как быть?
cursor.executemany("select ...", df.values.tolist() )) ;
= ) затык на уровне логики ...
magic command %sql тут не работает (((((((((((((((((
Получается некая конструкция, за которую ручки нужно откручивать ....
for i in range(0, len(m_list)) :
reg_ppg = "SELECT min_value , max_value FROM table_type t WHERE t.id=\'" + str(m_list[i][1]) + '\' ;'
cursor.execute(reg_ppg)
records = cursor.fetchall()
for row in records: print( row )
============================================================
=) но это кошмарно и позорно
============================================================
TabError: inconsistent use of tabs and spaces in indentation
Но если выполнить сгенерированный запрос отдельно, то он выполняется...
SELECT m.id, m.name FROM type_list m WHERE 0.0>=m.min_value;
SELECT m.id, m.name FROM type_list m WHERE 40.0>=m.min_value;
SELECT m.id, m.name FROM type_list m WHERE 2.0>=m.min_value;
SELECT m.id, m.name FROM type_list m WHERE 20.0>=m.min_value;
SELECT m.id, m.name FROM type_list m WHERE 91.0>=m.min_value;
....
Что значит минимум ресурсов?
От пандаса можно отказаться - читать эксель просто в список или словарь,
с помощью openpyxl например, что-то вроде:
spoiler
xl_in = 'мой_ексель_файл.xlsx'
wb = openpyxl.load_workbook(filename=xl_in, read_only=True)
ws = wb.active # лист экселя (активный)
rows = ws.rows # строки (это итератор по строкам)
first_row = [cell.value for cell in next(rows)] # Первая строка - заголовки
data = [] # это будет выходной массив построчно, каждая строка словарь (имя столбца - значение)
for row in rows:
record = {}
for key, cell in zip(first_row, row):
record[key] = cell.value
data.append(record)
# можно прям в этом цикле написать запрос к базе построчно
# и\или заполнить выходной массив
Пандас не нужен,
таблица представлена ввиде списка словарей.
Ага.
Viktor T2, да пожалуйста, можно выкнуть pandas , но у меня затык на уровне генерации запросов ... Если делать просто, циклом бегать по списку и выбирать нужные элементы, то получается что каждый раз отправляется новый select запрос =) , что ужасно.
Либо ты загружаешь все себе в память и там ковыряешься либо загружаешь всю или критичную для принятия решения информацию в одну базу (целевую или создав новую) и там ковыряешься
все остальные варианты - некрасивые
p.s. судя по коду тебе просто нужно взять идентификаторы из экселя и по ним найти записи в базе, попробуй собрать все идентификаторы в список и сделать огромный select ... where id in (...), кстати можно собирать некоторое их количества и делать блоками по к примеру 1000 записей
p.p.s. когда народ перестанет делать так и начнет пользоваться именованными параметрами? t.id=\'" + str(m_list[i][1]) + '\'