Используя SQLAlchemy, как мне обновить БД, используя только json?

#sqlalchemy

#sqlalchemy

Вопрос:

some_json

 { 
    "id": 1,
    "foo": "foo",
    "bar": "bar",
    "baz": "baz"
}
 

предположим, что все ключи в some_json столбцах

затем обычно, когда я обновляю базу данных, я делаю что-то вроде

 item = db.query.filter_by(id=some_json['id']).first()
if item:
    item.foo = some_json['foo']
    item.bar = some_json['bar']
    item.baz = some_json['baz']
    db.session.add(item)
    db.commit()
 

однако это, очевидно, может быть утомительным, если у вас все больше и больше ключей
, есть ли более простой способ обновить строки таблицы, просто передав json?

Комментарии:

1. Если isinstance(some_json, dict) есть True , то вы можете попробовать передать some_json в качестве значений параметров в insert() оператор, например, db.session.execute(item.__table__.insert(), some_json)

2. Вы должны быть в состоянии сделать instance = MyModel(**json_dict); db.add(instance) , если json_dict это квартира dict , и ее ключи совпадают с именами столбцов в MyModel .

Ответ №1:

Преобразовав json в dectionery, который отображает табличную модель table_model в вашем случае, вы можете написать свой код следующим образом:

 a= {
    "id": 1,
    "foo": "foo",
    "bar": "bar",
    "baz": "baz"
    }
item = table_model.query.filter_by(id=some_json['id']).first()
if item:
    item=table_model(**a)
    db.session.add(item)
    db.commit()
 

Комментарии:

1. Если вам нужна более сложная обработка данных, вы могли бы использовать что-то вроде marshmallow-sqlalchemy библиотеки. Marshmallow позволит вам быстро загружать объекты orm из json или словаря. Вы также можете определить функции предварительной / последующей загрузки для определенных атрибутов (столбцов) ORM, чтобы массировать поступающие данные. Например, вы могли бы определить функцию предварительной загрузки для шифрования пароля перед его сохранением. Очень полезно при создании стандартных rest API, где json, передаваемый между front и backend, обычно представляет собой просто json-сопоставления объектов orm базы данных.