Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy:从数据库查询填充实例属性_Python_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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

Python SQLAlchemy:从数据库查询填充实例属性,python,sqlalchemy,flask-sqlalchemy,Python,Sqlalchemy,Flask Sqlalchemy,我正在使用SQLAlchemy和下面的User模型来跟踪我网站上的用户。我试图让\uuuu init\uuuu方法在传递有效的用户id后填充类实例中的所有字段,但它的工作方式与预期不同 这是我的密码: class User(db.Model): # Fields id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(32)) email = db.Column(db.Stri

我正在使用SQLAlchemy和下面的
User
模型来跟踪我网站上的用户。我试图让
\uuuu init\uuuu
方法在传递有效的用户
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
    # ...
类用户(db.Model):
#田地
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(32))
email=db.Column(db.String(255),index=True)
#方法
定义初始化(self,id):
#填充字段
u=User.query.filter\u by(id=id.first)()
#填写结果中的姓名、电子邮件字段

self=u#对于这种特殊情况,可以使用它通过主键获取行:

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)

谢谢奥利。我仍然不清楚模型是如何从同一个类中更新的?没有更新,这就是重点。阅读classmethods。通常在SQLAlchemy中,构造函数用于创建新对象,例如插入到数据库中,而不是从数据库中加载对象。你是否特别需要用不同的方式做事?如果您只是在寻找一个方便的地方来定义查找函数,请参阅@Oleh的答案。也许我应该进一步说,在Python中,构造函数通常用于创建新实例,而不是查找现有实例。当您可以在已经存在的实例上编写非方法的函数时,为什么要使用构造函数进行查找?(正常函数,
classmethod
s,
staticmethod
s)@DanGetz谢谢Dan!所以我只需要将它从构造函数中移除,并将其移动到“普通”函数中。这很有道理
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)