SQLAlchemy是Python SQL工具包和对象关系映射器,它为应用程序开发人员提供了SQL的全部功能和灵活性。SQLAlchemy提供了一整套著名的企业级持久性模式,旨在实现高效和高性能的数据库访问,并改编为一种简单的python域语言。
pandas: 功能强大的Python数据分析工具包
pandas是一个Python包,它提供了快速、灵活和富有表现力的数据结构,旨在使处理“关系”或“标记”数据既简单又直观。它旨在成为用Python进行实际的、真实世界的数据分析的基本高级构建块。此外,它的更大目标是成为任何语言中可用的最强大和最灵活的开源数据分析/操作工具。它已经在朝着这一目标前进。
pip install SQLalchemy
pip install pandas
SQLalchemy github
pandas github
概念 | 对应数据库 | 说明 |
---|---|---|
Engine | 连接 | 驱动引擎 |
Session | 连接池,事务 | 由此开始查询 |
Model | 表 | 类定义 |
Column | 列 | |
Query | 若干行 | 可以链式添加多个条件 |
常见数据类型
数据类型 | SQL数据类型 | python数据类型 | 说明 |
---|---|---|---|
Integer | int | int | 整形,32位 |
String | varchar | string | 字符串 |
Text | text | string | 长字符串 |
Float | float | float | 浮点型 |
Boolean | tinyint | bool | True / False |
Date | date | datetime.date | 时间年月日 |
Date Time | datetime | datetime.datetime | 年月日时分秒毫秒等 |
Time | time | datetime.datetime | 时分秒 |
链接mysql,并创建数据库(有的业务数据库需要动态创建,可以用这种方法),注意.connect()的时候才是正式链接上mysql
connection = create_engine("mysql+pymysql://{0}:{1}@{2}/".format(
user, password, host
), isolation_level='AUTOCOMMIT', encoding='utf-8').connect()
connection.execute('CREATE DATABASE IF NOT EXISTS {};'.format(database))
connection.execute('USE {};'.format(database))
链接mysql中的指定database,这种使用方式是database已存在的使用用,不然会报错找不到database
engine = create_engine("mysql+pymysql://{0}:{1}@{2}/{3}".format(
user, password, host, database
), isolation_level='AUTOCOMMIT', encoding='utf-8')
读取excel
import pandas as pd
data = pd.ExcelFile(file)
读取指定sheet中的某行列的内容
example:读取第1个sheet中的第二行第一列的值
sheet1 = pd.read_excel(data,sheetname=0)
data1 = sheet1.iloc[2][1]
遍历每个sheet,挑选表头中包含‘ID’的sheet,满足条件的sheet下遍获取指定列’ID’的数据
sheet_names=data.sheet_names
for sheet in sheet_names:
df=pd.read_excel(data,sheetname=sheet)
if len(df)<1 or 'ID' not in df.head().keys():
continue
ID = df['ID'].values[i]
Name = df['Name'].values[i]
write_csv(csv_path, {'ID':ID,'Name':Name})
写csv
filename为 csv文件, mode为a 表示追加, index为写入行名称(索引),header为每次追加是否把标题追加进去
columns:代表设置csv的表头有哪几列
try:
df = pd.DataFrame(data,columns= ['ID','Name'],index=[0])
if not os.path.exists(csv_path):
df.to_csv(csv_path, header=True, index=False, mode='a')
else:
df.to_csv(csv_path, header=False, index=False, mode='a')
except Exception as e :
print(f"write csv failed:{e}")
比一条一条数据插入mysql性能更好
try:
df = pd.read_csv(csv_path, names= ['ID','Name'], header=0)
df["Date"] = time.strftime("%Y-%m-%d %H:%M:%S")
df.to_sql(table_name, con=engine, if_exists='append', index=False)
print("csv insert into sql success!")
except Exception as e :
print(f"csv insert into sql failed : {e}")
import pandas as pd
import os,sys
from sqlalchemy import create_engine
engine = None
#链接数据库
def mysql_conn(user, password, host,database):
try:
with create_engine("mysql+pymysql://{0}:{1}@{2}/".format(
user, password, host
), isolation_level='AUTOCOMMIT', encoding='utf-8').connect() as connection:
connection.execute('CREATE DATABASE IF NOT EXISTS {};'.format(database))
connection.execute('USE {};'.format(database))
engine = create_engine("mysql+pymysql://{0}:{1}@{2}/{3}".format(
user, password, host, database
), isolation_level='AUTOCOMMIT', encoding='utf-8')
except Exception as e :
print(f"mysql connect failed :{e}")
return engine
#读取excel,写csv
def read_csv(file, csv_path):
data = pd.ExcelFile(file)
sheet_names=data.sheet_names
sheet1 = pd.read_excel(data,sheetname=0)
data1 = sheet1.iloc[2][1]
for sheet in sheet_names:
df=pd.read_excel(data,sheetname=sheet)
if len(df)<1 or 'ID' not in df.head().keys():
continue
for i in range(len(df)):
if not isinstance(df['ID'].values[i], str) or df['ID'].values[i] == "Case ID":
continue
ID = df['ID'].values[i]
Name = df['Name'].values[i]
write_csv(csv_path, {'ID':ID,'Name':Name})
def write_csv(csv_path, data):
try:
df = pd.DataFrame(data,columns=['ID','Name'],index=[0])
# filename为 csv文件, mode为a 表示追加, index为写入行名称(索引),header为每次追加是否把标题追加进去
if not os.path.exists(csv_path):
df.to_csv(csv_path, header=True, index=False, mode='a')
else:
df.to_csv(csv_path, header=False, index=False, mode='a')
except Exception as e :
print(f"write csv failed:{e}")
#把csv数据插入数据库,这里使用的engine为mysql_conn方法返回的对象
def insert_into_sql(csv_path, engine, table_name):
try:
df = pd.read_csv(csv_path, names= ['ID','Name'], header=0)
df["Date"] = time.strftime("%Y-%m-%d %H:%M:%S")
df.to_sql(table_name, con=engine, if_exists='append', index=False)
print("csv insert into sql success!")
except Exception as e :
print(f"csv insert into sql failed : {e}")
if __name__ == '__main__':
#execute example
engine = mysql_conn('XXXX', '1234', '3306', 'testdatabase')
read_csv('E:\test\data.xlsx','test.csv')
insert_into_sql('test.csv',engine, tablename)