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

新手上路,请多包涵

下面我有一个 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

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

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

原文由 Kumaran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

您可能希望使用类方法来完成此操作。

 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

原文由 Patrick Allen 发布,翻译遵循 CC BY-SA 3.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))

原文由 barakbd 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题