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

时间:2016-03-05 12:38:09

标签: python python-2.7 flask sqlalchemy flask-sqlalchemy

下面我有Flask-SQLAlchemyUser的模型。

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方法,则应将名称添加到User表中。

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

2 个答案:

答案 0 :(得分:12)

您可能希望使用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

答案 1 :(得分:0)

不确定这与Flask-SQLAlchemy是否有关,但是基本的SQLAlchemy具有创建Mixin类或扩展Base类的示例。

https://docs.sqlalchemy.org/en/13/orm/extensions/declarative/mixins.html

例如

from sqlalchemy.ext.declarative import declared_attr

class MyMixin(object):

    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()

    __table_args__ = {'mysql_engine': 'InnoDB'}
    __mapper_args__= {'always_refresh': True}

    id =  Column(Integer, primary_key=True)

class MyModel(MyMixin, Base):
    name = Column(String(1000))