2-2-flask框架-扩展-数据库访问-SQLAlchemy
SQLAlchemy介绍
SQLAlchemy 是一个 Python 的 SQL 工具包以及数据库对象映射框架。它包含整套企业级持久化模式,专门为高效和高性能的数据库访问。
简单使用,代码示例
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 的好处:
-
避免裸写 SQL 语句,一个是看起来简洁,另一个是借助 ORM 框架防止 SQL 注入
-
将 Data 抽象为 Object,由此可以融入现有的 OO 编程方法
缺点:
- 据说 ORM 性能不行不过以我自身的姿势水平,还没到考虑 ORM 对性能消耗的地步,另外从周围前辈们的经验来看,基本也都推荐使用 ORM 作为最佳实践
这个其实挺复杂。就像Python到底要不要异步一样;
小项目简单脚本上ORM会费事,所以并不建议。
大一点的项目或者变化较快的项目ORM是一个好东西,可以让开发更加高效。
再大一些,需要考虑性能时,手写SQL是必须的,尤其是某些场景ORM会带来额外性能消耗,这时一般数据结构变化可能性小了很多,手写SQL会带来一些性能优化,可以考虑。
所以,大点项目要用orm,
1,可以提升开发效率,
2,可以避免一些安全问题,裸sql,可能会有安全问题,
而复杂的sql,还不如手写,使用orm太麻烦了,