zl程序教程

您现在的位置是:首页 >  前端

当前栏目

flask框架-Flask-SQLAlchemy

框架 Flask SqlAlchemy
2023-09-14 08:59:02 时间

####

####

简单使用,代码示例

from flask import Flask, request
from flask_restful import Resource, Api
from flask_sqlalchemy import SQLAlchemy
import json

app = Flask(__name__)
# api 和 app 要关联在一起
api = Api(app)
# 连接mysql数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:Ji10201749@localhost:3306/flask_test?charset=utf8'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

db = SQLAlchemy(app)


class TestCase(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=False, nullable=False)
    desc = db.Column(db.String(120), unique=False, nullable=False)
    steps = db.Column(db.String(120), unique=False, nullable=False)

    def __repr__(self):
        return '<TestCase %r>' % self.name

    def model_to_dict(self):
        return {c.name: getattr(self, c.name) for c in self.__table__.columns}


# 类要继承resource
class TestCaseSearch(Resource):
    def get(self):
        print(request.args)
        id = request.args.get("id")
        if id:
            return TestCase.query.filter_by(id=id).first().model_to_dict()
        return [item.model_to_dict() for item in TestCase.query.all()]

    def post(self):
        print(request.json)
        data_dict = request.json

        data_dict["steps"] = json.dumps(data_dict["steps"])
        print(data_dict)
        testcase = TestCase(**data_dict)
        db.session.add(testcase)
        db.session.commit()

        return {
            "msg": "success"
        }


# 注册到api里面去
api.add_resource(TestCaseSearch, '/testcase')

if __name__ == '__main__':
    db.create_all()
    app.run(debug=True, use_reloader=True)

###

1,flask,使用flask-sqlalchemy连接mysql数据库

2,使用flask-sqlalchemy创建表,

3,使用flask-sqlalchemy查询数据,单条和多条

4,使用flask-sqlalchemy查询数据,新增数据

5,把查询的数据json序列化,

###

 

###

用来发起post请求的代码:

import requests

url = "http://127.0.0.1:5000/testcase"
data = {"name": "test", "desc": "1234", "steps": ['1', '2', '3']}

result = requests.post(url, json=data)

print(result.text)

####

后续的新建表,一对多关联,多对多关联,等等后面在学

还有复杂的查询,都是后面在学,

现在先开一个头,

#####

是否一定要使用orm?

群众都是用ORM的,你目前觉得raw sql写的更舒服是因为你没面临需求不断变更,上线压力大的情况。
试想下raw sql这样的有几个问题
1)移植很困难,让你把数据库从mysql迁移到Oracle,给你一天时间,60个表要改,你怎么办
2)转义很难处理
3)基本没法做cache
4)可读性
所以更好的方案是用ORM,有性能非常瓶颈的时候再有针对性优化

--

所以小项目,根本不需要使用orm,

个人经验,每一个立志简洁不用orm的项目,随着业务复杂度提高,最后都发展出自己的一套残缺版orm

大的项目还是推荐ORM。如果你裸写SQL,随着业务和人员的增加你也会试着封装与DB连接的模块,那么恭喜你,你自己写了一个ORM。

### 

一开始决定不用ORM的,最终都被逼得自己重新造了个蹩脚的ORM轮子;
一开始决定使用ORM的,最终都被逼得绕开ORM自己挽起袖子裸写SQL。
药丸!

##

可以集成orm,最好是查询使用裸sql,orm负责增删改,orm的特性也不要用太多(比如主外键关联啥的最好不用),这样达到简洁而又不用编写大量的sql,代码看上去更可读

使用 ORM 的好处:

1. 避免裸写 SQL 语句,一个是看起来简洁,另一个是借助 ORM 框架防止 SQL 注入

2. 将 Data 抽象为 Object,由此可以融入现有的 OO 编程方法

缺点:

1. 据说 ORM 性能不行不过以我自身的姿势水平,还没到考虑 ORM 对性能消耗的地步,另外从周围前辈们的经验来看,基本也都推荐使用 ORM 作为最佳实践

###

这个其实挺复杂。就像Python到底要不要异步一样;

小项目简单脚本上ORM会费事,所以并不建议。

大一点的项目或者变化较快的项目ORM是一个好东西,可以让开发更加高效。

再大一些,需要考虑性能时,手写SQL是必须的,尤其是某些场景ORM会带来额外性能消耗,这时一般数据结构变化可能性小了很多,手写SQL会带来一些性能优化,可以考虑。

####

所以,大点项目要用orm,

1,可以提升开发效率,

2,可以避免一些安全问题,裸sql,可能会有安全问题,

而复杂的sql,还不如手写,使用orm太麻烦了,

 

 

####