2016-03-05 42 views
1

我有以下sqlalchemy模型的表用户。如何在sqlalchemy模型中添加自定义函数/方法来执行CRUD操作?

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 

这里add_user是一个自定义函数。所以如果我调用add_user方法,它应该将名称添加到用户表中。同样,如何为该模型本身的CRUD操作编写自定义函数。

回答

2

您可能想要使用classmethod来完成此操作。

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() 

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

更妙的是,它是一个伟大的想法来创建此方法和其他类似一个mixin,这样的功能可以在其他车型很容易重复使用:

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

然后,您可以重复使用此功能您的模型通过使用多重继承,如下所示:

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 
相关问题