Форум сайта python.su
Добрый день.
Стоит задача импортировать определенные данные из 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)
Отредактировано okril (Окт. 14, 2020 18:36:21)
Офлайн
Ты должен разделить задачу на как минимум на два этапа.
1. Получение данных из эксель.
2. Запись в данных в БД.
Причем каждый из них разделить на еще более мелкие и универсальные.
Зачем тебе sqlalchemy? psycopg2 нормально работает.
Офлайн
Я не против , делал и так и так, в указанном примере я нашёл значение но оно кортеж, если отпить в базу , можете написать пример этой же задачи … спасибо
Офлайн
Всем добрый день.
продолжая мысль (как найти в 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
Офлайн
okrilПроблема в том, что ты программировать не умеешь. А оно с неба не падает. Надо проходить теорию, закреплять её на практике потом, а потом ещё и расширенный практический опыт набирать, применяя полученные знания к практическим повседневным задачам.
я понимаю что возможно есть более элегантное решение (функция, использовать XLRD и тому подобное).. но мысли кончились .. перерыл интернет.. .. поделетес мыслями, возможно вы подскажете совершенно другое подход к этому решению
okrilНадо, наоборот, использовать минимум сторонних пакетов.
В виду не опытности, пришел к выбору Pandas, Sqlalchemy
Отредактировано py.user.next (Окт. 15, 2020 21:33:26)
Офлайн
Привет,
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
Отредактировано okril (Окт. 18, 2020 00:14:16)
Офлайн