Массовая вставка SQLAlchemy из данных JSON - PullRequest
0 голосов
/ 05 ноября 2018

Моя первая попытка с ORM, попытка понять, как она работает, но с небольшим испытанием:

То, что я пытаюсь сделать, это вставить JSON из API в модель SQLAlchemy, а затем массово вставить все записи в мою базу данных. Но по какой-то причине я получаю сообщение об ошибке в SQLAlchemy.

Из того, что я понимаю об ошибке, в какой-то момент времени при назначении данных моей модели они преобразуются в диктовку, когда я подумал, что это должен быть список class objects.

Мой ожидаемый результат - успешная вставка всех записей. Кто-нибудь может помочь понять, что я могу делать неправильно?

Цените. *

Ошибка

sqlalchemy.exc.ProgrammingError:
(mysql.connector.errors.ProgrammingError) 
Failed processing pyformat-parameters;
Python 'dict' cannot be converted to a MySQL type

JSON:

{
"all_orders": [
    {
    "id": 456215587,
    "created_at": "2018-11-04T23:18:18-02:00",
    "order_number": null,
    },
    {
    "id": null,
    "created_at": "2018-11-04T23:18:18-02:00",
    "order_number": 1982,
    }]
}

Функция

def update_orders(all_orders):

    cursor = db_cursor()
    session = db_session()
    orders_entries = []

    for orders in all_orders:

       order_id        = orders.get("id", {})
       order_number    = orders.get("order_number", {})
       created_at      = orders.get("created_at", {})

       new_entry = SalesOrders(order_id=order_id,
                               order_number=order_number,
                               created_at=created_at)

       orders_entries.append(new_entry)

    session.add_all(orders_entries)
    session.commit()

Модель

class SalesOrders(db.Model):
    __tablename__ = 'sales_orders'

    id = Column(Integer, nullable=False, index=True)
    order_id = Column(String(50), primary_key=True, server_default=text("''"))
    order_number = Column(String(50))
    created_at = Column(String(100))

РЕДАКТИРОВАТЬ, чтобы сделать его проверяемым. Функция .get () создавала словарь вместо None объекта, и SQLAlchemy не смог вставить словарь Python.

1 Ответ

0 голосов
/ 05 ноября 2018

При использовании функции get() SQLAlchemy получает dict, чего не ожидается в функции вставки SQL, которая выдает ошибку. Чтобы заставить его работать, просто передайте объект None вместо {}.

import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import *


basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'main.db')

db = SQLAlchemy(app)


data = {
   "all_orders": [
      {
         "id": 456213548,
         "created_at": "2018-11-04T23:18:18-02:00",
         "number": null
      },
      {
         "id":4562222222,
         "created_at": "2018-11-04T23:18:18-02:00",
         "number": 1982,
      }
   ]
}


class SalesOrders(db.Model):
    __tablename__ = 'sales_orders'

    order_id = db.Column(db.String(50), primary_key=True, server_default='')
    order_number = db.Column(db.String(50))
    created_at = db.Column(db.String(50))


def update_orders(data):
    orders_entries = []
    for orders in data["all_orders"]:
        new_entry = SalesOrders(order_id=orders['id'],
                                order_number=orders['number'])
        orders_entries.append(new_entry)
    db.session.add_all(orders_entries)
    db.session.commit()


if __name__ == "__main__":
    app.run(debug=True)

Пример:

>>> import app
>>> from app import *
>>> data
{'all_orders': [{'id': 456213548, 'created_at': '2018-11-04T23:18:18-02:00', 'number': 1982}, {'id': 4562222222, 'created_at': '2018-11-04T23:18:18-02:00', 'number': 1982}]}
>>> update_orders(data)
>>> SalesOrders.query.all()
[<SalesOrders 456213548>, <SalesOrders 4562222222>]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...