Десериализовать UUID с помощью зефира - PullRequest
0 голосов
/ 29 мая 2020

Я использую зефир и sqlalchemy в моем приложении RESTful flask для сериализации и десериализации моих моделей (я делаю все это впервые). Я создал маршрут для получения всех пользователей из базы данных MySQL. При запросе к базе данных я могу получить всех пользователей (id, first_name, last_name). При распечатке пользователей я вижу:

[
  ('UUID1', 'firstname1', 'lastname1'),
  ('UUID2', 'firstname2', 'lastname2')
]

ПРИМЕЧАНИЕ: Я сохраняю идентификатор как двоичный и использую функции базы данных BIN_TO_UUID () и UUID_TO_BIN ().

Ответ, который я получаю, когда нажимаю на этот маршрут:

[
  {"first_name": "firstname1", "last_name": "lastname1"},
  {"first_name": "firstname2", "last_name": "lastname2"}
]
class UsersSchema(Schema):
    id = fields.UUID(attribute="id")
    first_name = fields.String()
    last_name = fields.String()

    class Meta:
        fields = ("id", "first_name", "last_name")

class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Binary(16), primary_key=True)
    first_name = db.Column(db.VARCHAR(255))
    last_name = db.Column(db.VARCHAR(255))

@app.route('/users')
def users():
    try:
        users = db.session.query(
            func.bin_to_uuid(Users.id),
            Users.first_name,
            Users.last_name,
        ).all()

    except Exception as e:
        print('we got an error in users route')
        print(e)
    finally:
        return jsonify(UsersSchema(many=True).dump(users))

1 Ответ

1 голос
/ 29 мая 2020

Первый столбец в вашем запросе, вероятно, не называется id из-за применения функции bin_to_uuid. Тогда схема не возвращает значение id, потому что такого столбца нет. Решением должно быть присвоение псевдонима первому столбцу в запросе id:

db.session.query(
    func.bin_to_uuid(Users.id).label('id'),
    Users.first_name,
    Users.last_name,
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...