利用 Python FastAPI 框架 以及 openpyxl 模块 实现 将Excel表格数据 批量导入至 Mysql 数据库

该博客介绍了如何使用Python的FastAPI、openpyxl和SQLAlchemy库将Excel文件中的数据批量导入到MySQL数据库中。首先,确保在CentOS7上安装了必要的软件包和MySQL数据库,然后创建数据库表结构。接着,通过openpyxl读取Excel文件内容,使用SQLAlchemy建立数据库连接并插入数据。最后,启动FastAPI应用进行测试,确保数据成功导入。
摘要由CSDN通过智能技术生成

实验环境

PyCharm 2018.1

CentOS Linux 7

实验前提:

1.已完成虚拟环境的创建以及pycharm连接linux操作

2.在linux上已经安装mysql数据库(mariadb也可以)

3.已经创建 test_excel数据库(执行sql语句:create database test_excel charset=utf8;)

新建 test.xlsx 文件,并写入数据:

实验步骤:

1.安装软件包

pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install fastapi -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple

2.编写代码

# 导入FastAPI模块
from fastapi import FastAPI
# 创建app实例
app = FastAPI()

# 导入load_workbook模块,用于操作excel表格
from openpyxl import load_workbook

## 连接数据库

# 连接mysql数据库需要导入pymysql模块
import pymysql
pymysql.install_as_MySQLdb()

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

# 配置数据库地址:数据库类型+数据库驱动名称://用户名:密码@机器地址:端口号/数据库名
engine = create_engine("mysql+pymysql://root:westos@localhost:3306/test_excel", encoding='utf-8')
# 把当前的引擎绑定给这个会话;
# autocommit:是否自动提交  autoflush:是否自动刷新并加载数据库  bind:绑定数据库引擎
Session = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 实例化
session = Session()


# declarative_base类维持了一个从类到表的关系,通常一个应用使用一个Base实例,所有实体类都应该继承此类对象
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

from sqlalchemy import Column, String, Integer

# 创建数据库模型(定义表结构:表名称,字段名称以及字段类型)
class Student(Base):
    # 定义表名
    __tablename__ = 'student_message'
    # 定义字段
    # primary_key=True 设置为主键
    # 默认Integer为Integer(11)
    num = Column(Integer, primary_key=True, nullable=False)
    name = Column(String(200), nullable=False)
    age = Column(Integer, nullable=False)
    classes = Column(String(200), nullable=False)
    score = Column(Integer, nullable=False)

    # 构造函数
    def __init__(self, num, name, age, classes, score):
        self.num = num
        self.name = name
        self.age = age
        self.classes = classes
        self.score = score

    # 打印形式
    def __str__(self):
        return "num:%s, name:%s, age:%s, classes:%s, score:%s" % (str(self.num), self.name, str(self.age), self.classes, str(self.score))

# 在数据库中生成表
# 注意:需要先生成数据库表以后再注释掉
# Base.metadata.create_all(bind=engine)



## 批量添加(将excel表格中的数据导入到mysql数据库中)
@app.get("/user/addStudents")
async def InserUser():
    try:
        # 打开工作薄与工作表
        wb = load_workbook('test.xlsx')
        sheet = wb.get_sheet_by_name('Sheet1')

        # 计算表格数据的有效行数rows
        num = 1
        while 1:
            cell = sheet.cell(row=num, column=1).value
            if cell:
                num = num + 1
            else:
                # print(num)
                break
        rows = num - 1
        # print(rows)

        # for循环迭代读取xls文件中的每行数据, 从第二行开始因为需要跳过标题行
        # 注意:openpyxl方式表格列标与行标都是从1开始计算的
        for r in range(2, rows + 1):
            numData = sheet.cell(row=r, column=1).value
            nameData = sheet.cell(row=r, column=2).value
            ageData = sheet.cell(row=r, column=3).value
            classesData = sheet.cell(row=r, column=4).value
            scoreData = sheet.cell(row=r, column=5).value
            # values = (numData, nameData, ageData, classesData, scoreData)
            # print(values)
            # 添加数据
            dataStudent = Student(num=numData, name=nameData, age=ageData, classes=classesData, score=scoreData)
            session.add(dataStudent)
        session.commit()
        session.close()
    except ArithmeticError:
        return {"code":"0002","message":"数据库异常"}
    return {"code":"0000","message":"添加成功"}

3.测试

# 启动应用程序
(venv) [root@localhost fast]# uvicorn budget_manage:app --host '192.168.56.20' --port 8080 --reload

MariaDB [test_excel]> desc student_message;

MariaDB [test_excel]> select * from student_message;

注意:需要先生成student_message数据库表,之后再导入数据;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值