Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 05.08.2019
Сообщений: 5

SQLAlchemy загрузка данных

21.01.2024, 14:46. Показов 1306. Ответов 3

Студворк — интернет-сервис помощи студентам
Здравствуйте, я получаю данные по API из Озона и хочу загрузить их в бд через ORM со связью 1 ко многим. Две таблицы имеют следующие модели в ORM:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class OzonProductPrice(Base):
  __tablename__ = "ozon_product_price"
 
  id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
  articul: Mapped[str] = mapped_column(String(120))
  brand: Mapped[str] = mapped_column(String(50))
  product_price: Mapped[float]
  product_price_plus_invest: Mapped[float]
  date_update_db: Mapped[datetime] = mapped_column(
      server_default=func.now(),
      default=datetime.utcnow)
  ozon_orders_info: Mapped[list["OzonOrders"]] = relationship( # Для одной цены есть множество заказов
      back_populates = "ozon_product_price",
      cascade = "all, delete-orphan"
)
 
 
class OzonOrders(Base):
  __tablename__ = "ozon_orders_info"
 
  id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
  articul: Mapped[str] = mapped_column(String(120))
  brand: Mapped[str] = mapped_column(String(30))
  order_number: Mapped[str] = mapped_column(String(120))
  posting_number: Mapped[str] = mapped_column(String(120))
  date_created_at: Mapped[datetime] = mapped_column(
      server_default=func.now(),
      default=datetime.utcnow)
  in_process_at: Mapped[datetime] = mapped_column(
      server_default=func.now(),
      default=datetime.utcnow)
  status: Mapped[str] = mapped_column(String(120))
  product_price_order: Mapped[float]
  currency_code: Mapped[str] = mapped_column(String(90))
  product_name: Mapped[str] = mapped_column(String(200))
  product_sku: Mapped[str] = mapped_column(String(140))
  product_quantity: Mapped[str] = mapped_column(String(140))
  warehouse_name: Mapped[str] = mapped_column(String(140))
  commission_percent: Mapped[float]
  ozon_product_price_id = mapped_column(ForeignKey("ozon_product_price.id"))
  date_update_db: Mapped[datetime] = mapped_column(
      server_default=func.now(),
      default=datetime.utcnow)
  ozon_product_price: Mapped["OzonProductPrice"] = relationship( # Для множества заказов есть только одна цена
      back_populates = "ozon_orders_info"
  )
Однако, когда я пытаюсь загрузить данные через метод insert получаю ошибку:
Code
1
2
sqlalchemy.exc.StatementError: (builtins.TypeError) unhashable type: 'list'
[SQL: INSERT INTO ozon_product_price (id = ozon_product_price_id, articul, brand, product_price, product_price_plus_invest, date_update_db) VALUES (%(param_1)s, %(articul)s, %(brand)s, %(product_price)s, %(product_price_plus_invest)s, %(date_update_db)s) RETURNING ozon_product_price.id]
Процесс загрузки выглядит так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
with engine_dwh_staging.connect() as conn:
    for item_price in range(len(data_ozon_price)):
        for item_orders in range(len(data_ozon_orders)):
        # если артикул цены совпадает с артикулом заказа, то собираем заказы в список
            if data_ozon_price.iloc[item_price]['articul'] == data_ozon_orders.iloc[item_orders]['article']:
                sql = insert(OzonProductPrice).values(
                    articul=data_ozon_price.iloc[item_price]['articul'],
                    brand=data_ozon_price.iloc[item_price]['brand'],
                    product_price=data_ozon_price.iloc[item_price]['product_price'],
                    product_price_plus_invest=data_ozon_price.iloc[item_price]['product_price_plus_invest'],
                    date_update_db=data_ozon_price.iloc[item_price]['date_update_db'],
                    ozon_orders_info=[
                            OzonOrders(
                                articul=data_ozon_orders.iloc[item_orders]['article'],
                                brand=data_ozon_orders.iloc[item_orders]['brand'],
                                order_number=data_ozon_orders.iloc[item_orders]['order_number'],
                                posting_number=data_ozon_orders.iloc[item_orders]['posting_number'],
                                date_created_at=data_ozon_orders.iloc[item_orders]['date_created_at'],
                                in_process_at=data_ozon_orders.iloc[item_orders]['in_process_at'],
                                status=data_ozon_orders.iloc[item_orders]['status'],
                                product_price_order=data_ozon_orders.iloc[item_orders]['product_price_order'],
                                currency_code=data_ozon_orders.iloc[item_orders]['currency_code'],
                                product_name=data_ozon_orders.iloc[item_orders]['product_name'],
                                product_sku=data_ozon_orders.iloc[item_orders]['product_sku'],
                                product_quantity=data_ozon_orders.iloc[item_orders]['product_quantity'],
                                warehouse_name=data_ozon_orders.iloc[item_orders]['warehouse_name'],
                                commission_percent=data_ozon_orders.iloc[item_orders]['commission_percent'],
                                date_update_db=data_ozon_orders.iloc[item_orders]['date_update_db']
                            )]
                )
                conn.execute(sql)
                conn.commit()
Что я делаю не так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2024, 14:46
Ответы с готовыми решениями:

Добавление данных в таблицу БД в цикле for. sqlalchemy PYTHON
Помогите с кодом Python. Нужно скопировать записи с БД с заменой одного значения. Есть модель БД: lass Group(db.Model): ...

Подключение к SQL базе данных через SQlAlchemy
Добрый день всем. На 4 день работы поставили задачу - подключиться к серверу с SQL-базой данных через SQLAlchemy, вытянуть оттуда...

Отображение данных в tableview используя sqlalchemy
Всех приветствую. Отображение данных в tableview с помощью SqlRelationalTableModel не представляет трудностей. Есть такой вопрос. С помощью...

3
Заблокирован
21.01.2024, 18:13
Наверно так. Примерно набросал.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
with engine_dwh_staging.connect() as conn:
    session = Session(bind=conn) #создаём сессию ORM
    for item_price in range(len(data_ozon_price)):
        orders = [] #создаём пустой список для заказов
        for item_orders in range(len(data_ozon_orders)):
            #если артикул цены совпадает с артикулом заказа, то создаём объект заказа и добавляем его в список
            if data_ozon_price.iloc[item_price]['articul'] == data_ozon_orders.iloc[item_orders]['article']:
                order = OzonOrders(
                    articul=data_ozon_orders.iloc[item_orders]['article'],
                    brand=data_ozon_orders.iloc[item_orders]['brand'],
                    order_number=data_ozon_orders.iloc[item_orders]['order_number'],
                    posting_number=data_ozon_orders.iloc[item_orders]['posting_number'],
                    date_created_at=data_ozon_orders.iloc[item_orders]['date_created_at'],
                    in_process_at=data_ozon_orders.iloc[item_orders]['in_process_at'],
                    status=data_ozon_orders.iloc[item_orders]['status'],
                    product_price_order=data_ozon_orders.iloc[item_orders]['product_price_order'],
                    currency_code=data_ozon_orders.iloc[item_orders]['currency_code'],
                    product_name=data_ozon_orders.iloc[item_orders]['product_name'],
                    product_sku=data_ozon_orders.iloc[item_orders]['product_sku'],
                    product_quantity=data_ozon_orders.iloc[item_orders]['product_quantity'],
                    warehouse_name=data_ozon_orders.iloc[item_orders]['warehouse_name'],
                    commission_percent=data_ozon_orders.iloc[item_orders]['commission_percent'],
                    date_update_db=data_ozon_orders.iloc[item_orders]['date_update_db']
                )
                orders.append(order)
        #добавляем все заказы в сессию ORM
        session.add_all(orders)
        #фиксируем изменения в базе данных
        session.commit()
        #создаём объект цены с ссылками на id заказов
        price = OzonProductPrice(
            articul=data_ozon_price.iloc[item_price]['articul'],
            brand=data_ozon_price.iloc[item_price]['brand'],
            product_price=data_ozon_price.iloc[item_price]['product_price'],
            product_price_plus_invest=data_ozon_price.iloc[item_price]['product_price_plus_invest'],
            date_update_db=data_ozon_price.iloc[item_price]['date_update_db'],
            ozon_orders_info=[order.id for order in orders] #используем список id заказов
        )
        #добавляем объект цены в сессию ORM
        session.add(price)
        #фиксируем изменения в базе данных
        session.commit()
0
0 / 0 / 0
Регистрация: 05.08.2019
Сообщений: 5
21.01.2024, 18:23  [ТС]
Да, так работает. Получается ORM через транзакции с базой взаимодействует.

Как эту ошибку исправить: (psycopg2.ProgrammingError) can't adapt type 'numpy.int64' ? При загрузке данных.
0
Заблокирован
21.01.2024, 19:23
pythph, нужно преобразовать numpy.int64 в обычный int или long с помощью функции int() или long().

К примеру.
Изменить строку:
Python
1
articul=data_ozon_orders.iloc[item_orders]['article']
На строку:
Python
1
articul=int(data_ozon_orders.iloc[item_orders]['article'])
Либо замени int на long.
В общем это нужно сделать для всех полей, которые имеют тип numpy.int64 в DataFrame.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.01.2024, 19:23
Помогаю со студенческими работами здесь

Ошибка ArgumentError при создании базы данных SQLAlchemy
Я не могу понять, в чем была ошибка, я все сделал по инструкции) Ошибка при попытке создать базу данных Текст ошибки: ...

Загрузка Данных Из Терминала Сбора Данных В Требование-накладную Упп
В УПП 8.2 стандартно предусмотрена загрузка из терминала сбора данных в документ "ПоступлениеТоваровИУслуг". По этому образцу...

Извлечение данных с сайта и загрузка этих данных в эксель
Всем доброго суток. Вопрос такого плана. Есть подраздел на сайте. В качестве примера рассмотрим сайт НБА (nba.com). Там есть раздел...

Загрузка данных, построение графика, сохранение и очистка данных
здравствуйте, нужно написать программу, в которой будет построение графика, кнопки: загрузка данных, нарисовать график, сохранение данных и...

Загрузка данных из Excel в базу данных Access на VBA
Буду очень рад если кто-нибудь приведет более менее понятный код, как можно это реализовать средствами VBA


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru