Я разрабатываю api в Flask, используя Marshmallow для сериализации/десериализации/проверки и SQLAlchemy как мой ORM.Обновление таблицы sqlalchemy с помощью схемы Marshmallow
В моих функциях обновления я хотел бы ограничить поля, которые можно обновить, например. Я не хочу, чтобы пользователи могли менять свою электронную почту на данный момент.
Для этого я создал схему (UserSchema) с ее полями, ограниченными кортежем (UserSchemaTypes.UPDATE_FIELDS). Кортеж не включает электронную почту.
Проблема, с которой я столкнулась, заключается в том, что письмо является обязательным полем для пользовательских строк в моей базе данных.
Поэтому, когда я создаю объект модели пользователя с помощью схемы (users_schema.load (user_json)), на сеанс sqlalchemy добавляется незаконный объект.
#schema to validate the posted fields against
users_schema = UserSchema(only=UserSchemaTypes.UPDATE_FIELDS)
#attempt to deserialize the posted json to a User model object using the schema
user_data = users_schema.load(user_json)
if not user_data.errors:#update data passed validation
user_update_obj = user_data.data
User.update(user_id,vars(user_update_obj))
В самой моей функции обновления Затем я должен удалить этот незаконный объект из сеанса через db.session.expunge_all(), как если бы я не получаю OperationalError.
@staticmethod
def update(p_id,data):
db.session.expunge_all()#hack I want to remove
user = User.query.get(p_id)
for k, v in data.iteritems():
setattr(user, k, v)
db.session.commit()
OperationalError получил, когда db.session.expunge_all() Удален:
OperationalError: (raised as a result of Query-invoked autoflush; consider
using a session.no_autoflush block if this flush is occurring prematurely)
(_mysql_exceptions.OperationalError) (1048, "Column 'email' cannot be null") [SQL: u'INSERT INTO user (email, password, active, phone, current_login_at, last_login_at, current_login_ip, last_login_ip, login_count) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)'] [parameters: (None, None, 1, '0444', None, None, None, None, None)]
Есть ли лучше/уборщик способа сделать это?