Найти - Пользователи
Полная версия: Поиск значения в Excel и запись в PostGres
Начало » Python для новичков » Поиск значения в Excel и запись в PostGres
1
okril
Добрый день.
Стоит задача импортировать определенные данные из EXCEL файла в postgres.
Таблица m_report , поле GuestIn_D
должно произойти:

INSERT INTO m_report (id, “GuestIn_D”) VALUES (nextval('“seq_ManagerReport”'), {полученное значение из файла})

В виду не опытности, пришел к выбору Pandas, Sqlalchemy

Таблица с выделенными данными для импорта:
Таблица.

 import pandas as pd
import psycopg2
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy import Table, MetaData, Column, Integer, Sequence, Date , String, ForeignKey
base = declarative_base()
engine = create_engine('postgresql+psycopg2://MyDash:7413227@localhost/MyDash')
session=sessionmaker(bind=engine)()
class m_report(base):
    __tablename__='m_report'
    id = Column(Integer, Sequence('seq_ManagerReport'), primary_key=True)
    # Date=Column(Date)
    GuestIn_D = Column(Integer)
#чтение данных из файла
file ='FileImport/EXCEL/text.xls'
#Помещаем данные в DataFrame DF1
df1 = pd.read_excel(file)
df_day = df1[df1.Description=='Guests Inhouse'][['Day']]
df_day_value = df_day['Day'].tolist()
add_Day_Guests_Inhouse = m_report(GuestIn_D=(df_day_value))
session.add(add_Day_Guests_Inhouse)
session.commit()

при импорте возникает резонная ошибка что - не число

 sqlalchemy.exc.ProgrammingError: (psycopg2.errors.DatatypeMismatch) ОШИБКА:  столбец "GuestIn_D" имеет тип numeric, а выражение - integer[]
LINE 1: ...estIn_D") VALUES (nextval('"seq_ManagerReport"'), ARRAY[2]) ...
                                                             ^
HINT:  Перепишите выражение или преобразуйте его тип.
[SQL: INSERT INTO m_report (id, "GuestIn_D") VALUES (nextval('"seq_ManagerReport"'), %(GuestIn_D)s) RETURNING m_report.id]
[parameters: {'GuestIn_D': [2]}]
(Background on this error at: http://sqlalche.me/e/13/f405)



я понимаю что возможно есть более элегантное решение (функция, использовать XLRD и тому подобное).. но мысли кончились .. перерыл интернет.. .. поделетес мыслями, возможно вы подскажете совершенно другое подход к этому решению
Romissevd
Ты должен разделить задачу на как минимум на два этапа.
1. Получение данных из эксель.
2. Запись в данных в БД.
Причем каждый из них разделить на еще более мелкие и универсальные.
Зачем тебе sqlalchemy? psycopg2 нормально работает.
okril
Я не против , делал и так и так, в указанном примере я нашёл значение но оно кортеж, если отпить в базу , можете написать пример этой же задачи … спасибо
okril
Всем добрый день.
продолжая мысль (как найти в Excel документе определенные данные и передать из в СУБД)
Усложнив задачу (вы не знаете строка и столбца, но знаете название элемента в строке).

import pandas
import psycopg2
from psycopg2 import OperationalError

#Подключаемся к Базе данных
try:
conn = psycopg2.connect(dbname='MyDash', user='MyDash', password='7413227', host='127.0.0.1')
print("Connection to PostgreSQL DB successful")
except OperationalError as e:
print(f"The error '{e}' occurred")

#Создаем курсор

cursor = conn.cursor()

#Получаем данные из таблицы
# таблицыcursor.execute('select * from m_report')
# SQL = cursor.fetchone()
# print(SQL)

#чтение файла
File = pandas.read_excel('C:/PycharmProjects/DB/FileImport/EXCEL/text.xls')
#Запис в DataFrae
DF = pandas.DataFrame(File)
#Поиск строки содержащий в колонки Descrtiption значение 'Guests Inhouse'
DF1 = DF[DF.Description=='Guests Inhouse']
# Получаем в DF 1 строку содержащие различные колонки, получаем число из колонки Day
DF_VALUE = DF1.loc[0]['Day']
print(DF_VALUE)


Результат:
 C:\PycharmProjects\DB\venv\Scripts\python.exe C:/PycharmProjects/DB/DBconnection.py
Connection to PostgreSQL DB successful
2

Теперь наше значение готово для записи в базу в чистом виде, без дополнительных обработок.

Следующий шаг - запись в базу данных найденного значения. но это чуть позже
py.user.next
okril
я понимаю что возможно есть более элегантное решение (функция, использовать XLRD и тому подобное).. но мысли кончились .. перерыл интернет.. .. поделетес мыслями, возможно вы подскажете совершенно другое подход к этому решению
Проблема в том, что ты программировать не умеешь. А оно с неба не падает. Надо проходить теорию, закреплять её на практике потом, а потом ещё и расширенный практический опыт набирать, применяя полученные знания к практическим повседневным задачам.

okril
В виду не опытности, пришел к выбору Pandas, Sqlalchemy
Надо, наоборот, использовать минимум сторонних пакетов.

У тебя программа должна быть разложена по функциям. Одна функция подключается к Excel-файлу и вводит из него данные в питон. Вторая функция берёт эти введённые в питон из Excel-файла данные, преобразует их и получает результат. Третья функция берёт полученный результат, подключается к PostgreSQL-базе и сохраняет его туда. Может быть, тебе понадобится сделать ещё одну функцию к этим трём, которая приготовит результат перед сохранением его в PostgreSQL-базу. Это нормально.

Так что изучай классическое, самое обычное программирование. Тренируйся на кошках - на бессмысленных числах. Тогда всё и будет получаться на чём-то реальном уже.
okril
Привет,
1. Действительно изучаю Питон 1ю неделю. и все что ты сказал про опыт - действительно так и есть.
2. Числа не бессмысленные - поставил себе задачу, выбрал в качестве языка Питон и решаю ее, мне кажется изучать язык в разы Эффективнее когда в процессе обучение выполняешь что то нужное (знаешь задачу и понимаешь какой должен быть результат).

и Спасибо за идею завернуть все в функции..

вот что получилось

 import pandas
import psycopg2
from psycopg2 import OperationalError
#подключения к БД
try:
        conn = psycopg2.connect(dbname="MyDash", user="MyDash", password="7413227", host="127.0.0.1", port="5432", )
        print("Connection to PostgreSQL DB successful")
except OperationalError as e:
        print(f"The error '{e}' occurred")
def inser_data (data):
        cursor = conn.cursor()
        cursor.execute("INSERT INTO m_report (id, guestin_D) VALUES (nextval('seq_mreport'), %s)",(data,))
        conn.commit()
        cursor.close()
def select_data():
        cursor = conn.cursor()
        cursor.execute("select * from m_report")
        for row in cursor:
                print(row)
#чтение файла
def read_excel (frilename):
        File = pandas.read_excel(frilename)
        #Запис в DataFrae
        DF = pandas.DataFrame(File)
        #Поиск строки содержащий в колонки Descrtiption значение 'Guests Inhouse'
        DF1 = DF[DF.Description=='Guests Inhouse']
        # Получаем в DF 1 строку содержащие различные колонки, получаем число из колонки Day
        DF_VALUE = DF1.loc[0]['Day']
        return DF_VALUE
#Запись в переменную файл
File=('C:/PycharmProjects/DB/FileImport/EXCEL/text.xls')
# Вызов функции для получения значения
Value = read_excel(File)
#Запись в БД
inser_data(Value)
#чтение из БД
select_data()



Результат:
 C:\PycharmProjects\DB\venv\Scripts\python.exe C:/PycharmProjects/DB/DBconnection.py
Connection to PostgreSQL DB successful
(Decimal('1011'), None, Decimal('2'), None, None, None, None, None, None, None, None, None, None, None, None, None)
Process finished with exit code 0

П.С. само подключение так же имеет смысл завернуть в функцию…
пока все.. и я буду рад любым замечаниям - где и как лучше решить задачу. Дальше буду создавать циклы и читать не одну запись а весь файл.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB