【问题标题】:Deserialize UUID using marshmallow使用棉花糖反序列化 UUID
【发布时间】:2020-05-29 19:17:29
【问题描述】:

我在我的 RESTful 烧瓶应用程序中使用 marshmallow 和 sqlalchemy 来序列化和反序列化我的模型(这是我第一次做这一切)。我创建了一条从 MySQL 数据库中检索所有用户的路线。查询数据库时,我能够检索所有用户(id、first_name、last_name)。打印出用户时,我看到:

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

注意:我将 ID 存储为二进制文件并使用 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))

【问题讨论】:

  • 你从哪里得到func.bin_to_uuid 函数?我在 sqlalchemy 中找不到它...

标签: python flask-sqlalchemy marshmallow


【解决方案1】:

由于bin_to_uuid 函数应用程序,查询中的第一列可能不称为id。然后 Schema 不会产生 id 值,因为没有这样的列。解决方案应该是将查询中的第一列别名为id

db.session.query(
    func.bin_to_uuid(Users.id).label('id'),
    Users.first_name,
    Users.last_name,
)

【讨论】:

  • 天哪,你是救生员!!!!我一直试图解决这个问题很长时间。非常感谢,我很感激!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2016-09-01
  • 2019-03-04
相关资源
最近更新 更多