Задать вопрос
@NIKA_R

Как используя минимум ресурсов, при помощи 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 тут не работает (((((((((((((((((
Получается некая конструкция, за которую ручки нужно откручивать ....

df = pd.read_excel( './my_file.xlsx', sheet_name='easy', header=0, index_col=None)
m_list = df.values.tolist()

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;
....
  • Вопрос задан
  • 264 просмотра
Подписаться 1 Простой 4 комментария
Решения вопроса 1
@rPman
Либо ты загружаешь все себе в память и там ковыряешься либо загружаешь всю или критичную для принятия решения информацию в одну базу (целевую или создав новую) и там ковыряешься

все остальные варианты - некрасивые

p.s. судя по коду тебе просто нужно взять идентификаторы из экселя и по ним найти записи в базе, попробуй собрать все идентификаторы в список и сделать огромный select ... where id in (...), кстати можно собирать некоторое их количества и делать блоками по к примеру 1000 записей

p.p.s. когда народ перестанет делать так и начнет пользоваться именованными параметрами?
t.id=\'" + str(m_list[i][1]) + '\'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы