Вставка SQLAlchemy из списка JSON в базу данных - PullRequest
1 голос
/ 17 февраля 2020

У меня есть список с JSON примерно так:

print(type(listed)) # <class 'list'>
print (listed)

[
   {
       "email": "x@gmail.com",
       "fullname": "xg gf",
       "points": 5,
       "image_url", "https://imgur.com/random.pmg"
   },
   {
        ... similar json for the next user and so on
   }
]

Я пытаюсь вставить их в мою postgres базу данных, в которой есть такая модель:

class Users(db.Model):
    __tablename__ = 'users'

    email = db.Column(db.String(), primary_key=True)
    displayName = db.Column(db.String())
    image = db.Column(db.String())
    points = db.Column(db.Integer())

Но я довольно застрял, я пробовал несколько подходов, но ни один из них не работал, кто-нибудь может подсказать мне пример того, как это сделать правильно?

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

Вот решение без pandas с использованием SQLAlchemy Core

create engine

engine = sqlalchemy.create_engine('...')

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

metadata = sqalchemy.Metadata(bind=engine)

сделайте ссылку на таблицу

users_table = sqlalchemy.Table('users', metadata, autoload = True)

, после чего вы можете начать вставку

for user in json:
    query = users_table.insert()
    query.values(**user)

    my_session = Session(engine)
    my_session.execute(query)
    my_session.close()

Это создает сеанс для каждого пользователя в json, но я подумал, что вам все равно это может понравиться , Он очень гибкий и работает для любого стола, вам даже не нужна модель. Просто убедитесь, что json не содержит никаких столбцов, которые не существуют в БД (это означает, что вам нужно будет использовать «img_url» (имя столбца) как в ключе json, так и в имени столбца БД)

1 голос
/ 18 февраля 2020

Использование marshmallow-sqlalchemy

  1. проверка входящих JSON
  2. создание общих утилит для загрузки и выгрузки данных

Определить схемы

schema.py

from marshmallow import EXCLUDE
from marshmallow_sqlalchemy import ModelSchema
from app import db

class UserSchema(ModelSchema):
    class Meta(ModelSchema.Meta):
        model = Users
        sqla_session = db.session

user_schema_full = UserSchema(only=(
    'email',
    'displayName',
    'image',
    'points'
))

utils.py

Точные данные ниже не имеют значения, но создать общую утилиту для перехода от JSON к объектам ORM и объектам ORM к JSON. schema_partial используется для автоматически сгенерированных первичных ключей.

def loadData(data, schema_partial, many=False,
             schema_full=None, instance=None):
    try:
        if instance is not None:
            answer = schema_full.load(data, instance=instance, many=many)
        else:
            answer = schema_partial.load(data, many=many)
    except ValidationError as errors:
        raise InvalidData(errors, status_code=400)
    return answer


def loadUser(data, instance=None, many=False):
    return loadData(data=data,
                    schema_partial=user_schema_full,
                    many=many,
                    schema_full=user_schema_full,
                    instance=instance)

def dumpData(load_object, schema, many=False):
    try:
        answer = schema.dump(load_object, many=many)
    except ValidationError as errors:
        raise InvalidDump(errors, status_code=400)
    return answer


def dumpUser(load_object, many=False):
    return dumpData(load_object, schema=user_schema_full, many=many)

Используйте loadUser и dumpUser в API для получения чистого плоского кода. api.py

@app.route('/users/', methods=['POST'])
def post_users():
    """Post many users"""
    users_data = request.get_json()
    users =  loadUser(users_data, many=True)
    for user in users:
        db.session.add(user)

    object_dump = dumpUser(users, many=True)

    db.session.commit()

    return jsonify(object_dump), 201
1 голос
/ 17 февраля 2020

Вот пример списка json, как вы и предоставили.

json = [
   {
       "email": "x@gmail.com",
       "fullname": "xg gf",
       "points": 5,
       "image_url": "https://imgur.com/random.pmg"
   },
    {
       "email": "onur@gmail.com",
       "fullname": "o g",
       "points": 7,
       "image_url": "https://imgur.com/random_x.pmg"
   }
]

Теперь создайте пустой фрейм данных all_df и выполните итерации внутри списка json. Каждая итерация создает фрейм данных с данными из словаря внутри списка, транспонирует его и добавляет к all_df.

import pandas as pd

all_df = pd.DataFrame()
for i in json:
    df = pd.DataFrame.from_dict(data=i, orient='index').T
    all_df = all_df.append(df)

Вывод: expected output

Сейчас Вы можете go заранее создать сеанс для своей базы данных и pu sh all_df

all_df.to_sql(con=your_session.bind, name='your_table_name', if_exists='your_preferred_method', index=False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...