SQLAlchemy:从数据库查询填充实例属性

0 投票
1 回答
1548 浏览
提问于 2025-04-18 10:40

我在使用SQLAlchemy,下面这个User模型是用来跟踪我网站上的用户的。我想让__init__方法在传入一个有效的用户id后,自动填充类实例中的所有字段,但它没有按预期工作。

这是我的代码:

class User(db.Model):
    # Fields
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    email = db.Column(db.String(255), index=True)

    # Methods
    def __init__(self, id):
        # Populate the fields
        u = User.query.filter_by(id=id).first()

        # Fill in the name, email fields from the result
        self = u # <-- Not working as expected
    # ...

问题是这些属性没有被填充。

u = User(1)
u.id, u.name, u.email # <-- Output: None

我该如何从用户id自动填充所有类属性,而不需要一个一个地设置呢?

注意:我已经把上面代码中的验证部分去掉了,以免显得杂乱

注意2:我还是SQLAlchemy的新手,最近才开始学习Python。

1 个回答

1

在这个特定的情况下,你可以使用get方法,它可以通过主键获取一行数据:

u = User.get(1)
u.id, u.name, u.email

你代码中的问题是你试图使用一个绑定的方法,更糟糕的是,你在使用构造函数(在这里给self赋值根本没有任何作用)来获取一个完全不同的实例。

我会给你展示一个get方法的重新实现,这样你就可以在其他情况下重复使用它。

class User(db.Model):
    # ...

    @classmethod
    def get_by_id(cls, id):
        return cls.query.filter_by(id=id).one()


u = User.get_by_id(1)

撰写回答