如何在sqlalchemy模型中添加自定义函数/方法来进行CRUD操作?

Kum*_*ran 6 python sqlalchemy flask python-2.7 flask-sqlalchemy

下面我有一个Flask-SQLAlchemy表的模型User.

class User(db.Model):
    __tablename__ = 'user'

    user_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP"))
    updated_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP"))

    def __init__(self):
        #self.name = name
        self.name = None

    def add_user(self, name):
        self.name = name
Run Code Online (Sandbox Code Playgroud)

add_user是一个自定义方法.因此,如果我调用该add_user方法,它应该将名称添加到User表中.

同样,如何在该模型中为CRUD操作编写自定义方法?

Pat*_*len 14

您可能希望使用类方法来实现此目的.

class User(db.Model):
    __tablename__ = 'user'

    user_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP"))
    updated_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP"))

    def __init__(self, name):
        self.name = name

    @classmethod
    def create(cls, **kw):
        obj = cls(**kw)
        db.session.add(obj)
        db.session.commit()
Run Code Online (Sandbox Code Playgroud)

这样,您可以使用User.create(name="kumaran")创建将提交到数据库的新用户.

更好的是,为这个方法和其他类似方法创建一个mixin是个好主意,这样可以在其他模型中轻松地重用这些功能:

class BaseMixin(object):
    @classmethod
    def create(cls, **kw):
        obj = cls(**kw)
        db.session.add(obj)
        db.session.commit()
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用多重继承在模型中重用此功能,如下所示:

class User(BaseMixin, db.Model):
    __tablename__ = 'user'

    user_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    created_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP"))
    updated_at = db.Column(db.DateTime, nullable=False, server_default=db.text("CURRENT_TIMESTAMP"))

    def __init__(self, name):
        self.name = name
Run Code Online (Sandbox Code Playgroud)

  • 本例中的数据库会话来自哪里?让方法使用一个全局“db.session”对象是一种好的做法吗?就像这里的情况一样? (2认同)