记录我的pandas 配件 mySQL 处理数据的一些笔记
1、dataframe 写入 mysql
1、将sales数据写入mysql
def W_SQL_sanho_sales_V2024(df):
import pandas as pd
from sqlalchemy import create_engine, Column, Integer, String, DateTime, Float, BigInteger
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from datetime import datetime
# 2024年的价格明细表
# 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
engine = create_engine("mysql+pymysql://root:XXXXXXX@localhost:3306/" +
"sanho" + "?charset=utf8")
# 创建会话工厂,使用sessionmaker()函数绑定了数据库引擎。
Session = sessionmaker(bind=engine)
# 创建基类Base,它是SQLAlchemy的基础类。
Base = declarative_base()
# 定义数据模型
# ['成品编码','销售渠道', '销售区域', '经销商', '产品定位', '生命周期', '属性', '成本', '单价', '销量', '销售额', '成本额', '月', '年']
class sanho_sales_V2024(Base):
__tablename__ = 'sanho_sales_V2024'
id = Column(Integer, primary_key=True)
P_code = Column(BigInteger) # "成品编码"
channel = Column(String(30)) # "渠道"
sales_area = Column(String(30)) # "销售区域"
customs = Column(String(255)) # "客户名称"
P_position = Column(String(20)) # "产品定位"
lifecycle = Column(String(20)) # "生命周期"
P_attribute = Column(String(10)) # "属性"
P_cost = Column(Float) # "成本"
P_price = Column(Float) # "单价"
sales_volume = Column(Float) # "销量"
saleroom = Column(Float) # "销售额"
total_cost = Column(Float) # "成本额"
P_month = Column(String(4)) # "月"
P_year = Column(String(6)) # "年"
# default=datetime.now来设置默认值为当前时间戳。
timestamp = Column(DateTime, default=datetime.now)
# 创建数据表,使用Base.metadata.create_all(engine)创建数据表。
Base.metadata.create_all(engine)
# 创建会话
session = Session()
# 将DataFrame数据写入数据库
# 使用df.iterrows()遍历DataFrame中的每一行数据。在循环中,我们创建了一个数据对象data_obj,并将其添加到会话中。
for index, row in df.iterrows():
# print(row)
data_obj = sanho_sales_V2024(
P_code=row['成品编码'],
channel=row['渠道'],
sales_area = row['销售区域'],
customs=row['客户名称'],
P_position=row['产品定位'],
lifecycle=row['生命周期'],
P_attribute=row['属性'],
P_cost=row['成本'],
P_price=row['单价'],
sales_volume=row['销量'],
saleroom=row['销售额'],
total_cost=row['成本额'],
P_month=row['月'],
P_year=row['年'],
)
session.add(data_obj)
# 提交事务
session.commit()
# 关闭会话
session.close()
2、读取mysql所有数据
%%time
from sqlalchemy import create_engine, MetaData, Table
import pandas as pd
# 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
engine = create_engine("mysql+pymysql://root:XXXXXX@localhost:3306/" +
"sanho" + "?charset=utf8")
# 创建元数据对象
metadata = MetaData(bind=engine)
# 获取数据表对象
table = Table('sanho_sales_V2024', metadata, autoload=True)
# 创建查询语句
select_stmt = table.select()
# 执行查询操作并将结果转换为DataFrame
df = pd.read_sql(select_stmt, engine)
df.info()
3、读取符合条件的mysql数据
以下是 读取'sanho_sales_V2024'表中, 'P_year'列的值等于['2023年', '2024年']的所有数据
def read_SQL_V2024(SQLtable_name,SQLcolumn_name,SQLvalues):
from sqlalchemy import create_engine, select, MetaData, Table
import pandas as pd
# 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
engine = create_engine("mysql+pymysql://root:XXXXX@localhost:3306/" +
"sanho" + "?charset=utf8")
# 创建元数据对象
metadata = MetaData(bind=engine)
# 定义表名、列名和多个特定值
table_name = SQLtable_name
column_name = SQLcolumn_name
values = SQLvalues
# 获取表对象
table = Table(table_name, metadata, autoload=True)
# 构建查询语句
stmt = select([table]).where(table.columns[column_name].in_(values))
# 执行查询并获取结果
result = engine.execute(stmt).fetchall()
# 将结果转换为DataFrame
df = pd.DataFrame(result, columns=result[0].keys())
return df
# 读取'sanho_sales_V2024'表中, 'P_year'列的值等于['2023年', '2024年']的所有数据
SQLtable_name = 'sanho_sales_V2024'
SQLcolumn_name = 'P_year'
SQLvalues = ['2023年', '2024年']
df_sales_0 = read_SQL_V2024(SQLtable_name,SQLcolumn_name,SQLvalues)
4、删除符合条件的mysql数据
%%time
# del some data from mysql
from sqlalchemy import create_engine, MetaData, Table, delete
# 初始化数据库连接(按实际情况依次填写MySQL的用户名、密码、IP地址、端口、数据库名、格式)
engine = create_engine("mysql+pymysql://root:XXXXX@localhost:3306/" +
"sanho" + "?charset=utf8")
# 创建元数据对象
metadata = MetaData(bind=engine)
# 获取数据表对象
table = Table('sanho_sales_V2024', metadata, autoload=True)
# 指定要删除的列和值列表
# 删除'P_year'列中所有['2024年']行的数据
column_name = 'P_year'
values_to_delete = ['2024年']
# 创建删除语句
delete_stmt = delete(table).where(table.c[column_name].in_(values_to_delete))
# 执行删除操作
with engine.begin() as conn:
conn.execute(delete_stmt)