Flask项目(五) 使用PyMySql 操作数据库

基础工作

安装包


pipenv install flask-sqlalchemy

pipenv install PyMySql

准备数据库

数据库名字 testpython 里面一张表 student

里面三个字段 id name age 然后随便插入 5 条数据

Python 操作数据库

分成 8 个步骤

(1) 导包


import pymysql

(2) 数据库链接设置


conn = pymysql.connect(host,user,password,port,db,charset)
  • begin():开启事务
  • commit():提交事务 (执行增删改,需要用得到)
  • cursor():创建游标
  • ping(): 检查链接是否存在,不存在就会重新激活
  • rollback(): 回滚事务
  • close():关闭链接
  • select_db(): 选择数据库
  • show_warnings(): 查看 warnings 信息

(3) 生成游标(执行 sql,获取数据)

  • execute():执行单挑语句
  • executemany(): 执行多条语句
  • fetchone():获取第一行
  • fetchmany(size):获取下几(size)行
  • fetchall(): 获取剩下所有的行
  • scroll(num,mode): 移动游标
  • rowcount:计算 corsor 的行数
  • description: 返回字段信息
  • close():关闭游标

重点 4 个 excute() excutemany() fetchall() close()


cur = conn.cursor(cursor=pymysql.cursors.DictCursor)

(4) 编写 sql 语句


sql = 'select * from student'

(5) 执行 sql 语句


cur.excute(sql)

(6) 获取数据


data = cur.fetchall()

(7) 关闭游标


cur.close()

(8) 关闭链接


conn.close()

这里特别注意的就是要是关闭链接后。每个接口前必须判断一下
检查是否断开链接 conn.ping(reconnect=True)

demo1

# coding utf-8#
#-----------------------------------------------
# Name: app
# Description
# Author: 雾烟云
# Date: 2020/8/8 0008

from flask import Flask
from flask import jsonify
import pymysql

# 链接数据库
conn = pymysql.connect(host='127.0.0.1', # 主机地址
                       user='root', # 用户名
                       password='123456', # 密码
                       port=3306, # 端口
                       db="textpython", # 数据库
                       charset="utf8") # 字符集
# 实例化
app = Flask(__name__)

@app.route("/student",methods=['POST','GET'])
def student():
    #检查是否断开链接
    conn.ping(reconnect=True)
    # 生成游标
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor) # 让返回的数据是字典的形式
    # 编写sql语句
    sql = 'select * from student;'
    # 执行
    cur.execute(sql)
    # 获取数据
    data = cur.fetchall()
    print(data)
    # 关闭游标
    cur.close()
    # 关闭链接
    conn.close()
    # 给前端返回数据
    return jsonify(data)

# 插入数据
@app.route("/insertstudent",methods=['POST','GET'])
def student2():
    # 如果断开就重新链接
    conn.ping(reconnect=True)
    # 生成游标
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让返回的数据是字典的形式
    # 编写sql语句
    sql = 'Insert into student(id,name,age) values(6,"王五",20); '
    # 执行
    cur.execute(sql)
    # 提交事务
    conn.commit()
    # 关闭游标
    cur.close()
    # 关闭链接
    conn.close()
    # 给前端返回数据
    data = {
        'code':200,
        'result':{
            'success': True
        }
    }
    return jsonify(data)

# 修改数据
@app.route("/updatestudent",methods=['POST','GET'])
def student3():
    # 如果断开就重新链接
    conn.ping(reconnect=True)
    # 生成游标
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让返回的数据是字典的形式
    # 编写sql语句
    sql = 'Update student set name="李四" where id=6'
    # 执行
    cur.execute(sql)
    # 提交事务
    conn.commit()
    # 关闭游标
    cur.close()
    # 关闭链接
    conn.close()
    # 给前端返回数据
    data = {
        'code':200,
        'result':{
            'success': True
        }
    }
    return jsonify(data)

# 删除数据

@app.route("/deletestudent",methods=['POST','GET'])
def student4():
    # 如果断开就重新链接
    conn.ping(reconnect=True)
    # 生成游标
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让返回的数据是字典的形式
    # 编写sql语句
    sql = 'delete from student where id=6 '
    # 执行
    cur.execute(sql)
    # 提交事务
    conn.commit()
    # 关闭游标
    cur.close()
    # 关闭链接
    conn.close()
    # 给前端返回数据
    data = {
        'code':200,
        'result':{
            'success': True
        }
    }
    return jsonify(data)
# 执行多条语句
@app.route("/manysql",methods=["POST","GET"])
def student5():
    # 如果断开就重新链接
    conn.ping(reconnect=True)
    # 生成游标
    cur = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让返回的数据是字典的形式
    # 编写sql语句
    sql = 'Insert into student(id,name,age) values(%s,%s,%s); '
    # 多条执行必须用executemany,参数是list
    values = [(6,"王五",37),(7,"李四",26),(8,"侯六",33)]
    cur.executemany(sql,values)
    # 提交事务
    conn.commit()
    # 关闭游标
    cur.close()
    # 关闭链接
    conn.close()
    # 给前端返回数据
    data = {
        'code':200,
        'result':{
            'success': True
        }
    }
    return jsonify(data)
if __name__ =="__main__":
    app.run(host="127.0.0.1",debug=True,port=5000)

总结

  • 开始必须 conn.ping(reconnect=True)

  • select 是游标 cur.fetchall,增删改必须是链接 conn.commit()

  • 最后都关闭 close


文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录