#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 базы данных.