项目结构:
1.数据库连接池
通过pip插入数据驱动依赖
pip install flask-sqlalchemy
和pip install pymysql
1.1配置数据源(config.py)
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = '123321'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'tdata'
# mysql 不会认识utf-8,而需要直接写成utf8
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO = True
1.2引用Orm框架(exts.py)
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
1.3启动文件中注册(app.py)
from flask import Flask
# 引用数据库启动文件
from mapper.exts import db
# 引用数据库配置文件
import config
# 引用数据库
from controller.user_controller import *
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
app.register_blueprint(user, url_prefix="/user")
if __name__ == '__main__':
app.run(debug=True)
项目和数据库文件下载地址:https://gitee.com/hahaguai007/python-flask-mysql
2.数据库操作
通过Flask提供的orm框架对数据库进行操作
2.1增加
@user.route('/add/<username>/<pwd>')
def add_user(username, pwd):
print(username, pwd)
userinfo = User(username=username, pwd=pwd)
db.session.add(userinfo)
db.session.commit()
return jsonify("ADD_SUCCESS")
2.2删除
两种写法
# 第一种
user1 = User.query.filter().first()
print(user1.id)
db.session.delete(user1)
db.session.commit()
# 第二种
user2 = User.query.filter(User.id==2).delete()
db.session.commit()
2.3修改
user1 = User.query.filter(User.id == id).first()
user1.username = "我是修改后的"
db.session.merge(user1)
db.session.commit()
2.4查询
@user.route('/list')
def list_users():
users = User.query.all()
print(users)
users_output = []
for user in users:
users_output.append(user.to_json())
return jsonify(users_output)
2.4.1条件查询
如果不足请自行补充
1.filter_by和filter
两种写法根据版本的不同:
filter_by
: 用于查询简单的列名,不支持比较运算符filter
比filter_by
的功能更强大,支持比较运算符,支持or_
、in_
等语法。
- data = UserInfo.query.filter(UserInfo.name=='1').all()
- data = UserInfo.query.filter_by(name='1').all()
1. 根据用户名查询符合条件的第一条数据
User.query.filter_by(username=username).first()
print("查询1:", user1.to_json())
2. 查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.username.endswith('g')).all()
User.query.filter(User.username.contains('g')).all()
3. 查询名字不等于wang的所有数据[2种方式]
from sqlalchemy import not_
注意了啊:逻辑查询的格式:逻辑符_(类属性其他的一些判断)
User.query.filter(not_(User.username=='yang')).all()
User.query.filter(User.username!='yang').all()
4. 查询名字和邮箱都以 li 开头的所有数据[2种方式]
from sqlalchemy import and_
User.query.filter(and_(User.username.startswith('li'), User.email.startswith('li'))).all()
User.query.filter(User.username.startswith('li'), User.email.startswith('li')).all()
5. 查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据
from sqlalchemy import or_
User.query.filter(or_(User.pwd=='123456', User.email.endswith('tiantian.com'))).all()
6. 查询id为 [1, 3, 5, 7, 9] 的用户列表
User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()
7. 查询name为liu的角色数据 关系引用
# 举例 暂时没有
User.query.filter_by(username='liu').first().role.name
8.获取第一条记录
User.query.first()
- 根据用户名查询
#根据用户名查询
user2 = User.query.filter_by(username=username)
print("查询2:", user1.to_json())
- 匹配用户名开头为1的用户
# 匹配用户名开头为1的用户
users = User.query.filter(User.username.startswith('1')).all()
print(users)
users_output = []
for user3 in users:
users_output.append(user3.to_json())
print("查询3:", users_output)
- 根据ID查询
get方法没有数据返回None,不像django一样报错;只能id、查询,并且只能通过id的值查询,或者用ident=1
# 根据ID查询
user = User.query.get(userid)
print(user.to_json())
2.排序
- 升序
两种写法根据版本的不同:
- data = UserInfo.query.order_by(UserInfo.id).all() # 按照id升序
- data = UserInfo.query.order_by("id").all()
- 降序
两种写法根据版本的不同:
- data = UserInfo.query.order_by(UserInfo.id.desc()).all() # 按照id降序
- data = UserInfo.query.order_by(db.desc("id")).all() # 按照id降序
# 排序
user_list = User.query.order_by("username")
print(user_list)
users_output_list = []
for user4 in user_list:
users_output_list.append(user4.to_json())
print("查询4:", users_output_list)
3.区间查询
# 查询TOP3
user_list1 = User.query.limit(3).all()
print(user_list1)
users_output_list1 = []
for user5 in user_list1:
users_output_list1.append(user5.to_json())
print("查询5:", users_output_list1)
2.5分页查询
- 方式一:使用offset和limit(
.offset(offset).limit(limit
)) - 方式二:paginate分页支持(
.paginte(page=2,per_page=1)
)
Pagination的对象:
- has_prev/has_next——是否有上一页/下一页
- Items——当前页的数据列表
- prev_num/next_num——上一页/下一页的页码
- total——总记录数
- pages——总页数
http请求:127.0.0.1:5000/user/loadUserPage/2/1
@user.route('/loadUserPage/<int:page>/<int:per_page>')
def list_user(page, per_page):
""" 用户分页 """
# 每一页的数据大小-per_page 页码-page
# 1. 查询用户信息
user = User.query
# 2. 准备分页的数据
print(page, per_page)
user_page_data = user.paginate(page, per_page=per_page)
users_output = []
for user in user_page_data.items:
users_output.append(user.to_json())
print("当前页的数据列表", users_output)
print("是否有上一页", user_page_data.has_prev)
print("是否下一页", user_page_data.has_next)
print("上一页的页码", user_page_data.prev_num)
print("下一页的页码", user_page_data.next_num)
print("总记录数", user_page_data.total)
print("总页数", user_page_data.pages)
return jsonify(users_output)
""" 输出
当前页的数据列表 [{'pwd': '2', 'id': 2, 'username': '2', 'nick': '2'}]
是否有上一页 True
是否下一页 True
上一页的页码 1
下一页的页码 3
总记录数 7
总页数 7
"""