您好,我是码农飞哥,感谢您阅读本文!上一篇文章我们介绍了快速上手SQLAlchemy框架,两分钟了解Python之SQLAlchemy框架的使用今天就让我们学习下如何将Flask框架与SQLAlchemy框架进行整合。在Python的Web项目中我们都是使用Flask框架的,快速上手Flask请参考一分钟学会Flask框架的安装与快速使用。

项目结构图
下图展示的就是整个项目的项目结构:

软件环境
软件 | 版本 |
|---|---|
Python | 3.6.7 |
Flask | 1.0.2 |
Flask-Cors | 3.0.7 |
Flask-Script | 2.0.6 |
Flask-SQLAlchemy | 2.3.2 |
SQLAlchemy | 1.2.17 |
PyMySQL | 0.9.3 |
依赖下载
我们这里将依赖都放在了requirements.txt文件中进行管理,依赖库如下:
代码语言:javascript复制click==7.1.2Flask==1.0.2Flask-Cors==3.0.7Flask-Script==2.0.6Flask-SQLAlchemy==2.3.2SQLAlchemy==1.2.17PyMySQL==0.9.3
所以,依赖下载的话只需要执行该文件即可,执行的命令是:
代码语言:javascript复制pip install -r requirements.txt

编码
准备工作做好之后,就下来就是写代码环节了。这里创建了两个数据表,一个是用户表,一个是文章表,本系列文章要实现的是创建一个博客系统。
0. 数据表准备
代码语言:javascript复制--用户表CREATE TABLE `user`(-
`id`int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', -
`username` varchar(35) NOT NULL COMMENT '用户名', -
`password` varchar(35) NOT NULL COMMENT '密码', PRIMARY KEY (`id`),UNIQUE KEY `username`(`username`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';--文章表CREATE TABLE `post`(-
`id`int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', -
`author_id`int(11) NOT NULL COMMENT '作者id', -
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', -
`title` varchar(50) NOT NULL COMMENT '标题', -
`body` varchar(2048) NOT NULL COMMENT '正文', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章表';
1. 添加数据库配置
创建一个config.py文件,路径是 flaskr/config.py,这里主要添加的是数据库配置,如果后期有其他配置也可以在该文件里面。
# 数据库连接池SQLALCHEMY_DATABASE_URI ='mysql://root:123@127.0.0.1:23306/job'# 自动提交事务SQLALCHEMY_COMMIT_ON_TEARDOWN =True# 自动回滚事务SQLALCHEMY_TRACK_MODIFICATIONS =TrueSQLALCHEMY_POOL_SIZE =10SQLALCHEMY_MAX_OVERFLOW =5# 开启调试模式DEBUG =True
2. 初始化数据库
数据库的基本配置弄好之后,接下来就是初始化数据库,创建应用,文件地址 flaskr/__init__.py
from flask importFlaskfrom flask_sqlalchemy importSQLAlchemy# 初始化数据库db =SQLAlchemy()def create_app():app =Flask(__name__)-
# 加载数据库配置 app.config.from_object('config')-
# 向app中导入并注册db db.init_app(app)-
return app
3. 创建数据表对应的model
我们知道SQLAlchemy是一个ORM框架,就是将数据表与对象进行对应的。所以,针对前面的user表和post表,我们分别建立两个model。下面以user表为例,文件地址:flaskr/model/interactive_user.py
from flaskr import db#定义user表对应的model类InteractiveUserclassInteractiveUser(db.Model):__tablename__ ='user'id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True)password = db.Column(db.String(80), unique=True)-
# 序列化 -
@property -
def serialize(self): -
return{ -
'id': self.id, -
'username': self.username, -
'password': self.password -
} -
#定义获取属性的各个方法 -
def get_id(self): -
return self.id -
def get_username(self): -
return self.username -
def get_password(self): -
return self.password
4. 进行增删改查
最后一步,就是编写业务代码进行增删改查了。这里只会列举一些基本的查询方法,详细的查询方法,请参考,两分钟了解Python之SQLAlchemy框架的使用,下面所有的方法都是在 flaskr/biz/user_service.py文件中。
4.1 新增数据
代码语言:javascript复制def insert_user(username, password):-
try: user =InteractiveUser()user.username = usernameuser.password = password-
#将对象user放入session db.session.add(user)-
#提交数据 db.session.flush()-
return user -
exceptSQLAlchemyErroras e: db.session.rollback()-
raise e
4.2 更新数据
代码语言:javascript复制# 根据用户ID更新用户密码def update_model_state(id, password):user = db.session.query(InteractiveUser).filter(InteractiveUser.id == id).first()user.password = passworddb.session.commit()-
return user
4.3 查询数据
代码语言:javascript复制# 根据用户名查找用户def query_user_by_username(username, password):-
print('username={},password={}', username, password) user = db.session.query(InteractiveUser.id).filter(InteractiveUser.username == username,-
InteractiveUser.password == password).first() -
return user
5. 设置启动类
前面的步骤弄好之后,就到了我们的最后一步了,创建一个启动类,用于运行我们的app。文件地址是:/flaskr/manage.py。这里将项目的端口号设置为 5001。
from flaskr import create_appimport pymysql# 初始化MySQLdb模块pymysql.install_as_MySQLdb()app = create_app()if __name__ =='__main__':app.run(host='0.0.0.0', port=5001)
启动项目

总结
本文详细介绍了如何将Flask框架与SQLAlchemy框架进行整合。整体来说还是比较 简单,另外本文中的项目结构比较清晰,适合于在正式的项目中运用。需要注意的是:项目启动之后,我们还不能直接运行增删改查的方法。还需要创建一个视图类。


