pandas to_sql保存数据到数据库后,添加自增长的主键ID(PRIMARY KEY)

本文介绍如何使用Python的Pandas库生成DataFrame,并利用SQLAlchemy将其保存到MySQL数据库中,同时添加自增主键ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 构造dataframe
import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.randint(0, 20, size=(1000, 3)))
df.columns = ['col_1', 'col_2', 'col_3']
  1. 构造数据库
from sqlalchemy import create_engine

db_name = "test_db"  # 要保存的数据库名
table_name = "my_item_table"  # 要保存的表名
# engine = create_engine("mysql+pymysql://用户名:密码@127.0.0.1:3306/数据库名")
engine = create_engine('mysql+pymysql://testuser:testpassword@localhost:3306/{}'.format(db_name), encoding='utf8')
engine.connect()
  1. 然后使用to_sql()先保存dataframe
df.to_sql(table_name, engine, if_exists='replace', index=False)
  1. 使用sql语句在第一列插入主键ID
with engine.connect() as con:
    con.execute("""ALTER TABLE `{}`.`{}` \
            ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST, \
            ADD PRIMARY KEY (`id`);"""
                .format(db_name, table_name))

对应的SQL其实是:

ALTER TABLE `test_db`.`my_item_table`
	ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
	ADD PRIMARY KEY (`id`);

然后就可以看到结果:

  1. 验证

mysql workbench中可以通过:

SELECT * FROM test_db.my_item_table;

得到结果:
在这里插入图片描述

完整代码

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.randint(0, 20, size=(1000, 3)))
df.columns = ['col_1', 'col_2', 'col_3']
# 连接数据库
from sqlalchemy import create_engine

db_name = "test_db"  # 要保存的数据库名
table_name = "my_item_table"  # 要保存的表名
# engine = create_engine("mysql+pymysql://用户名:密码@127.0.0.1:3306/数据库名")
engine = create_engine('mysql+pymysql://testuser:testpassword@localhost:3306/{}'.format(db_name), encoding='utf8')
engine.connect()
# save to database
df.to_sql(table_name, engine, if_exists='replace', index=False)
# 增加主键
with engine.connect() as con:
    con.execute("""ALTER TABLE `{}`.`{}` \
            ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST, \
            ADD PRIMARY KEY (`id`);"""
                .format(db_name, table_name))

### 创建 MySQL 数据表 在 Python 中可以通过 `pymysql` 或者其他库来创建 MySQL 数据表。下面是一个简单的例子,展示如何使用 SQL 语句创建一个名为 `students` 的数据表: ```sql CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), age INT, grade FLOAT ); ``` 此命令定义了一个具有四个字段的数据表:`id`, `name`, `age`, 和 `grade`. 其中 `id` 是自增长主键[^1]。 对于更复杂的需求,比如设置外键约束或者索引,则可以在上述基础上进一步扩展 SQL 命令。 ### 导入 Excel 表格至 MySQL 要将 Excel 文件中的数据导入到 MySQL 数据库里,通常有两种方法可以选择: #### 方法一:通过 PHPMyAdmin 手动上传文件 如果已经有一个现成的数据库结构(例如之前提到过的 `excel` 库下的 `excel01` 表),可以直接利用图形界面工具如 phpMyAdmin 来完成这项工作。只需选择对应的目标表格,点击“导入”,再按照提示选取本地计算机上的 .xls/.xlsx 文件即可[^2]。 #### 方法二:编写脚本自动处理 另一种更为灵活的方式是借助编程语言实现自动化流程。这里给出一段基于 Pandas 库和 pymysql 进行操作的 Python 脚本片段作为示范: ```python import pandas as pd import pymysql # 加载Excel文档 df = pd.read_excel('path/to/your/excel_file.xlsx') connection = pymysql.connect( host='localhost', user='root', # 用户名 password='', # 密码 database='testdb'# 使用哪个DB ) try: with connection.cursor() as cursor: for row in df.itertuples(index=False): sql = f""" INSERT INTO excel01 (id, name, sex, professional, address) VALUES ({row.id}, '{row.name}', '{row.sex}', '{row.professional}', '{row.address}') """ cursor.execute(sql) finally: connection.commit() connection.close() ``` 这段代码会逐行读取 Excel 文档的内容,并将其插入到指定名称为 `excel01` 的 MySQL 表中。注意,在实际应用前应当适当调整路径参数和其他配置项以适应具体的环境需求[^3]。 ### 关于临时表的应用场景 当需要暂时保存某些中间计算结果而不影响原有永久性的业务逻辑时,可以考虑采用 MySQL 提供的 **临时表** 功能。这类特殊类型的表仅存在于当前会话期间;一旦客户端断开连接就会被自动删除。这使得它们非常适合用来做短期缓存或是辅助运算。 创建临时表的基本语法如下所示: ```sql CREATE TEMPORARY TABLE temp_table_name ( column_definitions... ); ``` 之后就可以像对待常规表一样向其中添加记录了。值得注意的是,由于这些对象只对发起者的 session 可见,因此不会与其他用户的活动发生冲突[^4]。 ### 完整的工作流概述 综上所述,整个过程大致分为以下几个部分: - 设计好目标关系型模型; - 编写相应的 DDL(Data Definition Language)指令构建物理存储空间; - 准备待迁移的数据源材料; - 实施 ETL(extract-transform-load)作业把外部资料迁移到内部仓库内; - (可选)根据实际情况决定是否引入临时性资源优化性能表现[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

呆萌的代Ma

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

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

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

打赏作者

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

抵扣说明:

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

余额充值