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

时间:2014-06-22 13:28:55

标签: python sqlalchemy flask-sqlalchemy

我使用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 个答案:

答案 0 :(得分:1)

对于这种特殊情况,您可以使用get按主键获取一行:

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

您的代码的问题在于您尝试使用绑定方法,更糟糕的是,构造函数(在其中分配给self什么都不做)来获取现有的,完全不同的实例。< / p>

我将展示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)