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

Python 如何在sqlalchemy模型中添加自定义函数/方法来执行CRUD操作?,python,python-2.7,flask,sqlalchemy,flask-sqlalchemy,Python,Python 2.7,Flask,Sqlalchemy,Flask Sqlalchemy,下面我有一个表用户的炼金术模型 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

下面我有一个表
用户
炼金术
模型

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\u user
是一个自定义方法。因此,如果我调用
add\u user
方法,它应该将名称添加到
user
表中


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

您可能需要使用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

不确定这是否与Flask SQLAlchemy相关,但基本SQLAlchemy有创建Mixin类或扩充基类的示例

e、 g


在本例中,数据库会话来自何处?方法使用一个全局
db.session
对象是否是一种好的做法,这里似乎就是这样?
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))