项目结构:

flask_sqlalchemy mysql表生成模型_flask

 

1.数据库连接池

通过pip插入数据驱动依赖pip install flask-sqlalchemypip 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: 用于查询简单的列名,不支持比较运算符 filterfilter_by的功能更强大,支持比较运算符,支持or_in_等语法。

  1. data = UserInfo.query.filter(UserInfo.name=='1').all()
  2. 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.排序

  • 升序

两种写法根据版本的不同:

  1. data = UserInfo.query.order_by(UserInfo.id).all() # 按照id升序
  2. data = UserInfo.query.order_by("id").all()
  • 降序

两种写法根据版本的不同:

  1. data = UserInfo.query.order_by(UserInfo.id.desc()).all() # 按照id降序
  2. 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
"""