网上找到的FLASK-RESTFUL的demo都没有dao层

在网上学习了一些FLASK-RESTFUL风格的代码,没有发现有封装DAO层的相关demo。是什么原因呢?我个人在开发的过程中发现了直接在接口中调用db去数据库查找数据时的一些缺点,想找一些dao层封装的demo学习一下,没有找到相关内容。
请教大家有过类似的经验可以分享一下吗?

建议买一本李大的书看看,个人理解:model就是Dao。

model层是数据库表的映射模型啊,之前用ssm开发的时候会有一层数据处理层(dao层)。我现在比较疑惑的是,难道REST风格的设计就是不需要dao层吗?但是我找不到这么做的理由,比如我有一个用户表,在好几个接口中都需要用到这张表的信息,有些是根据名称查询,有些是根据日期查询,如果没有dao层,我就需要在接口中使用orm进行条件拼接然后检索。如果有了dao层我就可以让dao层去做这件事,在接口中不需要关注数据是怎么搜索出来的,只要把参数传给dao层就行了。

不知道该怎么表达,因为Dao是Java的而现在是python。概念这个很难表达(我表达能力不太好)
而你说的在接口用orm,在Java中就和servlet用JDBC差不多,控制反转、切面这些是spring的,而不是Java的。 model是一个类里面可以有方法,当然这是个比较简陋的解决。
如果你想要实现和spring完全一样的开发,这个我是超纲了,要等大佬来回答。

有dao层抽象是因为直接操作下层太繁琐,但在Python这门动态语言中并非如此,试看:

# get a book by name
models.Book.query.filter(name=name).first()
# Dao?
dao.BookDao.get_by_name(name)

直接用上面这个,也就还好吧?抽象一层出来反而增加代码复杂度。当然,遇到复杂查询封装一个方法出来完全可以:

class Book(db.Model):
    # column definitions
    
    @classmethod
    def get_by_name(cls, name):
        return cls.query.filter(name=name).first()

# use it
book = models.Book.get_by_name(name)

所以2楼说model(ORM)兼顾dao的职责,在用Python的时候,多是灵活机变,而不像Java一样死板的一定要有model和dao的区分

1 Like

现在确实对python的orm有了更深的理解,如您所说封装一层DAO层确实会增加代码复杂度,提升维护成本,在涉及到复杂查询的地方特殊处理是更好的解决方式,感谢回复。