在Flask中使用MySQL数据库

本文详细介绍了如何在Flask应用中使用MySQL数据库,包括创建数据库、建表、插入数据以及通过pymysql库处理表单数据的提交和查询。

在Flask中使用MySQL数据库


前言

前面两章分别对mysql数据库进行了安装、flask的简单介绍,而本章将继续学习flask操作的mysql数据库。


一、mysql在flask开发中的作用

MySQL数据库在Flask开发中起到了存储、管理和检索数据的重要作用,使得应用程序能够有效地处理和展示数据。

1.1. 首先导入mysql数据库

在这里插入图片描述

1.2. 创建新的mysql数据库

在它的查询控制台console中实行如下语句(按ctrl+enter实行):

create database new_python_mysql;

1.3. mysql数据库建表

直接对mysql数据库右键单击新建,选择表格

在这里插入图片描述

1.4. 展示建表的语句

show create table python_mysql.user;

#结果:
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT '',
  `sex` varchar(10) DEFAULT '',
  `age` int DEFAULT '0',
  `email` varchar(128) DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='user_table'

1.5. 在表中新增数据

#新增一条数据:
insert into python_mysql.user( name, sex, age,email) values ('xinxin','women',23,'xinxin@qq.com');

二、flask提交表单数据到mysql

2.1. 使用pymysql库

使用pymysql库可以在Python中连接和操作MySQL数据库。它提供了一系列的方法和函数,使得在Python中使用MySQL数据库变得更加方便和灵活。

import pprint
import pymysql
from pymysql import cursors

#连接mysql数据库
def conn_mysql():
    return pymysql.connect(
        host="localhost",
        port= 端口号, 
        user= "root",
        password= 你的密码,
        database= "python_mysql",
        charset= "utf8"
    )



#查询数据
def query_data(sql):
    conn = conn_mysql()
    try:
        cursor = conn.cursor(pymysql.cursors.DictCursor) #返回数据是字典形式,而不是数组
        cursor.execute(sql)
        return cursor.fetchall()
    finally:
        conn.close()



#更新数据:
def insert_or_update_data(sql):
    conn = conn_mysql()
    try:
        cursor = conn.cursor()
        cursor.execute(sql)
        conn.commit() #提交
    finally:
        conn.close()



#尝试执行
if __name__ == "__main__":
    sql = "insert user (name,sex,age,email) values ('xingshi','man',18,'xingshi@qq.com')"
    insert_or_update_data(sql)
    sql = "select * from user"
    datas = query_data(sql)
    pprint.pprint(datas)

2.2. 提交网页表单数据

@app.route("/show_add_user")
def show_add_user():
    return render_template("show_add_user.html")

show_add_user.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>提交用户信息</title>
</head>
<body>
    <div>
        <h1>提交用户信息:</h1>
        <form action="/do_add_user" method="post">
            <table border="1">
                <tr>
                    <th>用户名</th>
                    <td><input type="text" name="name"></td>
                </tr>
                 <tr>
                    <th>性别</th>
                    <td><input type="text" name="sex"></td>
                </tr>
                 <tr>
                    <th>年龄</th>
                    <td><input type="text" name="age"></td>
                </tr>
                 <tr>
                    <th>邮箱</th>
                    <td><input type="text" name="email"></td>
                </tr>
                 <tr>
                    <th>提交</th>
                    <td><input type="submit" name="submit" value="提交"></td>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>
@app.route("/do_add_user",methods = ["POST"])
def do_add_user():
    print(request.form)
    name = request.form.get("name")
    sex = request.form.get("sex")
    age = request.form.get("age")
    email = request.form.get("email")
    sql = f"""
        insert into user(name,sex,age,email) 
        values ('{name}','{sex}',{age},'{email}')
    """
    print(sql)
    db.insert_or_update_data(sql)
    return "success"

#展示用户列表
@app.route("/show_users")
def show_users():
    sql = "select id,name from user"
    datas = db.query_data(sql)
    return render_template("show_users.html",datas = datas)

#<tr>...</tr> 定义一行标签,一组行标签内可以建立多组由<td>或<th>标签所定义的单元格
#<th>...</th>定义表头单元格。表格中的文字将以粗体显示
#<td>...</td> 定义单元格标签

show_users.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查看用户列表</title>
</head>
<body>
    <h1>查看用户列表</h1>
    <form>
        <table border="1">
            <tr>
                <th>用户ID</th>
                <th>用户名称</th>
                <th>查看详情</th>
            </tr>
            {% for user in datas %}
                <tr>
                    <td>{{ user["id"]}}</td>
                    <td>{{ user["name"]}}</td>
                    <td><a href="/show_user/{{ user["id"]}}">查看详情</a></td>
                </tr>
            {% endfor %}

        </table>
    </form>
</body>
</html>
@app.route("/show_user/<user_id>")
def show_user(user_id):
    sql ="select * from user where id=" +user_id
    datas = db.query_data(sql)
    # print(datas)
    user = datas[0]
    # print(user)
    return render_template("show_user.html",user=user)

show_user.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查看单个用户信息</title>
</head>
<body>
    <h1>查看单个用户信息</h1>
    <form>
        <table border="1">
            <tr>
                <th>用户ID</th>
                <td>{{ user["id"] }}</td>
            </tr>
             <tr>
                <th>姓名</th>
                <td>{{ user["name"] }}</td>
            </tr>
             <tr>
                <th>年龄</th>
                <td>{{ user["age"] }}</td>
            </tr>
             <tr>
                <th>性别</th>
                <td>{{ user["sex"] }}</td>
            </tr>
             <tr>
                <th>邮箱</th>
                <td>{{ user["email"] }}</td>
            </tr>

        </table>
    </form>

</body>
</html>

初始提交用户信息界面:

在这里插入图片描述

提交一个用户的信息:

在这里插入图片描述

显示提交成功,说明数据成功提交到mysql数据库中

在这里插入图片描述

在这里插入图片描述

进入展示用户列表的界面

在这里插入图片描述

点进最后一个用户的信息页面:

在这里插入图片描述


总结

本章主要简单介绍了mysql在flask开发中作用,并简单的做了一个向数据库中提交用户信息的页面程序。

人间总有一两风,填我十万八千梦。

–2023-9-24 进阶篇

<think> 我们使用Flask连接MySQL数据库通常需要以下步骤: 1. 安装必要的扩展:Flask-MySQLdb 或 PyMySQL 2. 配置数据库连接URI 3. 初始化数据库扩展(如使用Flask-SQLAlchemy) 这里我们以使用Flask-SQLAlchemy和PyMySQL为例(因为MySQLdb不支持Python3,通常我们使用PyMySQL作为替代) 步骤: 1. 安装依赖:flask, flask-sqlalchemy, pymysql 2. 配置数据库URI,格式为:mysql+pymysql://用户名:密码@服务器地址/数据库名?charset=编码 3. 初始化SQLAlchemy 示例代码: </think> 在 Flask 中连接 MySQL 数据库需要以下几个步骤,我将详细说明解决方案并提供完整代码示例: ### Flask 连接 MySQL 数据库的完整解决方案 #### 1. 安装必要依赖 首先安装 Flask-MySQL 相关的 Python 包: ```bash pip install flask flask-mysqldb ``` 注意:`flask-mysqldb` 是 MySQLdb 的封装,如果安装出现问题,可以改用 `pymysql`: ```bash pip install flask pymysql ``` #### 2. 配置 Flask 应用 在 Flask 应用中配置 MySQL 连接参数: ```python from flask import Flask from flask_mysqldb import MySQL # 或使用 from flask_pymysql import PyMySQL app = Flask(__name__) # MySQL 配置 app.config['MYSQL_HOST'] = 'localhost' # MySQL 服务器地址 app.config['MYSQL_USER'] = 'your_username' # MySQL 用户名 app.config['MYSQL_PASSWORD'] = 'your_password' # MySQL 密码 app.config['MYSQL_DB'] = 'your_database' # 数据库名称 app.config['MYSQL_CURSORCLASS'] = 'DictCursor' # 返回字典格式的结果 # 初始化 MySQL mysql = MySQL(app) # 如果使用 pymysql # from flask_pymysql import PyMySQL # mysql = PyMySQL(app) ``` #### 3. 数据库连接与查询示例 创建一个路由来演示数据库操作: ```python @app.route('/users') def users(): try: # 创建游标 cur = mysql.connection.cursor() # 执行查询 cur.execute("SELECT * FROM users") # 获取所有结果 users = cur.fetchall() # 关闭游标 cur.close() # 返回结果 return {'users': users} except Exception as e: return f"数据库错误: {str(e)}", 500 @app.route('/add_user/<name>') def add_user(name): try: cur = mysql.connection.cursor() # 执行插入操作 cur.execute("INSERT INTO users (name) VALUES (%s)", (name,)) # 提交事务 mysql.connection.commit() cur.close() return f"用户 {name} 添加成功" except Exception as e: return f"添加用户出错: {str(e)}", 500 ``` #### 4. 创建数据库表(初始化脚本) 在项目根目录创建 `init_db.py` 文件: ```python from app import mysql def init_database(): try: cur = mysql.connection.cursor() # 创建用户表 cur.execute(""" CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(80) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) """) # 创建其他表... mysql.connection.commit() cur.close() print("数据库初始化成功!") except Exception as e: print(f"数据库初始化失败: {str(e)}") if __name__ == '__main__': init_database() ``` #### 5. 使用 ORM(SQLAlchemy)的完整示例 更推荐使用 ORM 方式操作数据库: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 配置 MySQL 连接 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/dbname' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) # 定义用户模型 class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) def __repr__(self): return f'<User {self.username}>' # 创建路由 @app.route('/create_user/<username>/<email>') def create_user(username, email): new_user = User(username=username, email=email) db.session.add(new_user) db.session.commit() return f"用户 {username} 创建成功" @app.route('/users') def list_users(): users = User.query.all() return {'users': [{'id': u.id, 'username': u.username, 'email': u.email} for u in users]} if __name__ == '__main__': # 首次运行时创建表 db.create_all() app.run(debug=True) ``` ### 连接 MySQL 的注意事项 1. **连接参数说明**: - `host`:MySQL 服务器地址(可以是 IP 或域名) - `user`:数据库用户名 - `password`:数据库密码 - `database`:要连接的数据库名称 - `port`:MySQL 端口(默认 3306) 2. **常见问题解决**: - **认证插件问题**:如果遇到 `caching_sha2_password` 错误,在 MySQL 客户端执行: ```sql ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES; ``` - **连接超时**:在配置中添加 `app.config['MYSQL_CONNECT_TIMEOUT'] = 10` - **SSL 连接**:如果需要 SSL 连接: ```python app.config['MYSQL_SSL_CA'] = '/path/to/ca.pem' app.config['MYSQL_SSL_CERT'] = '/path/to/client-cert.pem' app.config['MYSQL_SSL_KEY'] = '/path/to/client-key.pem' ``` 3. **连接池管理**: ```python app.config['MYSQL_POOL_SIZE'] = 5 # 连接池大小 app.config['MYSQL_POOL_RECYCLE'] = 300 # 连接回收时间(秒) ``` 4. **生产环境最佳实践**: - 不要在代码中硬编码数据库凭证 - 使用环境变量管理敏感信息: ```python import os app.config['MYSQL_PASSWORD'] = os.environ.get('DB_PASSWORD') ``` - 为 Flask 应用创建专用数据库用户,只授予必要权限 - 使用连接池避免频繁创建/销毁连接 ### 完整应用结构示例 ``` myapp/ ├── app/ │ ├── __init__.py # 应用初始化 │ ├── models.py # 数据库模型 │ ├── routes.py # 路由定义 │ └── config.py # 配置文件 ├── requirements.txt └── run.py ``` 在 `config.py` 中: ```python import os class Config: MYSQL_HOST = os.getenv('DB_HOST', 'localhost') MYSQL_USER = os.getenv('DB_USER', 'flask_app') MYSQL_PASSWORD = os.getenv('DB_PASSWORD', 'secure_password') MYSQL_DB = os.getenv('DB_NAME', 'flask_db') ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星石传说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值