使用第三方库连接MySql数据库:PyMysql库和Pandas库

使用PyMysql库和Pandas库链接Mysql

1 系统环境

  • 系统版本:Win10 64位
  • Mysql版本: 8.0.15 MySQL Community Server - GPL
  • pymysql版本: 0.7.9
  • pandas版本:0.20.3
  • sqlalchemy版本:1.1.13
  • 代码编辑IDE: Jupyter1.0.0

2 使用PyMysql库链接Mysql

直接导入Pymysql库:

import pymysql

然后建立数据库连接:

conn = pymysql.connect(
    host='localhost',
    user='root',
    password='XXXXXX',
    database='data',
    port=3306,
    charset='utf8'
)

此处会报一个keyError:255的异常:

  • 异常原因:Mysql8.0更新了很多字符集,但是这些字符集长度超过255了,所以旧版的PyMysql不支持长度超过255的字符。
  • 解决办法:更新PyMySQL包,使用conda upgrade pymysql命令更新失败,直接使用python -m pip install --upgrade pymysql更新成功,PyMySQL版本更新到0.9.3,该异常消除。

获取数据库游标:

cur = conn.cursor()

 用游标执行SQL语句,将数据加载到内存:

sql = 'SELECT * FROM company'
cur.execute(sql)

 从内存取数赋值到变量:

data = cur.fetchall()
# 完成取数后关闭游标和数据库连接
cur.close()
conn.close()
data
((43,
  '北京欧应科技有限公司',
  "['五险一金', '扁平化管理', '创业型企业', '岗位晋升']",
  '唯医网',
  '150-500人',
  "['东大桥', 'CBD', '朝外']"),
 (53,
  '北京创锐文化传媒有限公司',
  "['技能培训', '节日礼物', '季度奖金', '岗位晋升']",
  '聚美优品',
  '2000人以上',
  "['东直门', '海运仓', '东四']"),
  .......
)

每条记录以元组的形式存放在一个大的元组内。此时,游标已经移动到数据的末尾,已经无法再继续取数

遍历元素:

for item in data[0]:
    print(item)
43
北京欧应科技有限公司
['五险一金', '扁平化管理', '创业型企业', '岗位晋升']
唯医网
150-500人
['东大桥', 'CBD', '朝外']

3 使用Pandas库链接Mysql

Pandas库连接Mysql数据库的核心方法:

pandas.read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

常用参数:

  • sql: string SQL query or SQLAlchemy Selectable (select or text object) to be executed, or database table name.
  • con:  SQLAlchemy connectable(engine/connection) or database string URI or DBAPI2 connection (fallback mode) Using SQLAlchemy makes it possible to use any DB supported by that library. If a DBAPI2 object, only sqlite3 is supported.

3.1 旧版本的pandas库中con参数使用pymysql库创建的connect对象

导入需要的库:

import pymysql
import pandas as pd

简历数据库连接:

conn = pymysql.connect(
    host='localhost',
    user='root',
    password='XXXXXX',
    database='data',
    port=3306,
    charset='utf8'
)

创建SQL查询语句:

sql = 'SELECT * FROM company'

使用pandas读取数据库:

df = pd.read_sql(sql, conn)
df
companyId    companyFullName    companyLabelList    companyShortName    companySize    businessZones
0    43    北京欧应科技有限公司    ['五险一金', '扁平化管理', '创业型企业', '岗位晋升']    唯医网    150-500人    ['东大桥', 'CBD', '朝外']
1    53    北京创锐文化传媒有限公司    ['技能培训', '节日礼物', '季度奖金', '岗位晋升']    聚美优品    2000人以上    ['东直门', '海运仓', '东四']
2    62    北京字节跳动科技有限公司    ['扁平管理', '弹性工作', '大厨定制三餐', '就近租房补贴']    今日头条    2000人以上    ['双榆树', '大钟寺', '中关村']

3.2 新版本的pandas库中con参数使用sqlalchemy库创建的create_engine对象

导入需要的库:

import pymysql
import pandas as pd
from sqlalchemy import create_engine

创建create_engine对象(格式类似于URL地址):

engine = create_engine('mysql+pymysql://root:XXXXXXXd@localhost:3306/data?charset=utf8')

创建SQL查询语句:

sql = 'SELECT * FROM company'

使用pandas读取数据库:

df = pd.read_sql(sql, conn)
df
companyId    companyFullName    companyLabelList    companyShortName    companySize    businessZones
0    43    北京欧应科技有限公司    ['五险一金', '扁平化管理', '创业型企业', '岗位晋升']    唯医网    150-500人    ['东大桥', 'CBD', '朝外']
1    53    北京创锐文化传媒有限公司    ['技能培训', '节日礼物', '季度奖金', '岗位晋升']    聚美优品    2000人以上    ['东直门', '海运仓', '东四']
2    62    北京字节跳动科技有限公司    ['扁平管理', '弹性工作', '大厨定制三餐', '就近租房补贴']    今日头条    2000人以上    ['双榆树', '大钟寺', '中关村']

 4 使用Pandas库读写Mysql数据库

用Pandas从Mysql的data数据库中加载company表和dataanalysis表,然后将两张表以companyId列进行合并,然后分组统计各个城市各个公司的个数,最后将结果写入data数据库的newtable表(若不存在,新建)中。

导入库:

import pymysql
import pandas as pd
from sqlalchemy import create_engine

因为涉及到多次读写,所以将读写操作都封装为函数。

封装读取函数:

def read_from_mysql(sql, db_name='data'):
    engine = create_engine('mysql+pymysql://root:XXXXXXXX@localhost:3306/{db_name}?charset=utf8'.format(db_name=db_name))
    df = pd.read_sql(sql, engine)
    return df

参数说明:

  • sql: 一个用于在数据库上执行的SQL语句。
  • db_name: 将要在哪个数据库上进行操作,默认为data数据库。

加载company表:

sql_company = 'SELECT * FROM company'
df_company = read_from_mysql(sql_company, 'data')
df_company.head(2)

    companyId    companyFullName            companyLabelList                 companyShortName    companySize      businessZones
0    43      北京欧应科技有限公司      ['五险一金', '扁平化管理', '创业型企业', '岗位晋升']        唯医网          150-500人     ['东大桥', 'CBD', '朝外']
1    53      北京创锐文化传媒有限公司    ['技能培训', '节日礼物', '季度奖金', '岗位晋升']          聚美优品          2000人以上    ['东直门', '海运仓', '东四']

加载dataanalysis表:

sql_dataanalyst = 'SELECT * FROM dataanalyst'
df_dataanalyst = read_from_mysql(sql_dataanalyst)
df_dataanalyst.head(2)
    positionId    city    companyId    firstType    secondType    education    industryField    positionAdvantage    positionName    positionLables    salary    workYear
0    80307      深圳    6718     职能    高端职能职位    本科    社交网络,生活服务    业务分析,自由度高,项目有发展前景。    数据分析师    ['分析师', '数据分析', '数据']    8k-15k    1-3年
1    100561      北京    62    技术    DBA    本科    移动互联网,数据服务    过亿用户+优厚薪资期权+三餐+住房补    数据抓取和处理(高级)工程师    ['数据']    20k-40k    不限

将company表和dataanalysis表以companyId为键进行合并:

result = df_dataanalyst.merge(df_company, on='companyId')
result.head(2)
    positionId    city    companyId    firstType    secondType    education    industryField    positionAdvantage    positionName    positionLables    salary    workYear    companyFullName    companyLabelList    companyShortName    companySize    businessZones
0    80307    深圳    6718    职能    高端职能职位    本科    社交网络,生活服务    业务分析,自由度高,项目有发展前景。    数据分析师    ['分析师', '数据分析', '数据']    8k-15k    1-3年    深圳市珍爱网信息技术有限公司    ['发展上升型', '朝阳行业', '创业氛围浓厚', '年终分红']    珍爱网    2000人以上    ['南头', '科技园', '桂庙路口']
1    899950    深圳    6718    设计    用户研究    本科    社交网络,生活服务    大公司 福利好 团队棒    数据分析师(资源策略)    ['分析师', '数据分析', '策略', '数据']    8k-15k    1-3年    深圳市珍爱网信息技术有限公司    ['发展上升型', '朝阳行业', '创业氛围浓厚', '年终分红']    珍爱网    2000人以上    ['南头', '科技园', '桂庙路口']

统计合并表中各个城市各个公司的个数:

result = result.groupby(['city', 'companyFullName'])['positionId'].count().reset_index()
result.head(2)
   city    companyFullName      positionId
0    上海    CMC Wiseme HK Limited      2
1    上海    Striking.ly, Inc.        1

封装写入函数:

def write_to_sql(df, tb_name, db_name='data'):
    engine = create_engine('mysql+pymysql://root:175458778sd@localhost:3306/{db_name}?charset=utf8'.format(db_name=db_name))
   #if_exists来控制写入的方式,index控制是否写入索引 df.to_sql(tb_name, con
=engine, if_exists='append', index=False)

参数说明:

  • df: 将要写入到数据库中的数据,Series或者DataFrame对象。
  • tb_name: 要写入到哪张表中。
  • db_name: 要写入到哪个数据库中,默认为data数据库。

将result写入到数据库:

write_to_sql(result, 'newtable')

查看数据库:

read_from_mysql('SHOW TABLES')
  Tables_in_data
0    company
1    dataanalyst
2    newtable
3    order
4    user

结果显示,数据已经写入到newtable表中:

read_from_mysql('SELECT * FROM newtable LIMIT 3')
    city    companyFullName    positionId
0    上海    CMC Wiseme HK Limited    2
1    上海    Striking.ly, Inc.    1
2    上海    VIKI PRIVATE LIMITED    1

 

转载于:https://www.cnblogs.com/strivepy/p/10772546.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Python进行MySQL数据处理和分析通常需要以下步骤: 1. 安装MySQL客户端:在Python中连接MySQL数据库需要使用第三方库,例如 `mysql-connector-python` 或者 `PyMySQL`。可以通过以下命令来安装 `mysql-connector-python`: ``` pip install mysql-connector-python ``` 或者安装 `PyMySQL`: ``` pip install PyMySQL ``` 2. 连接MySQL数据库使用 `mysql-connector-python` 或者 `PyMySQL` 连接MySQL数据库,并创建一个连接对象和一个游标对象,例如: ```python import mysql.connector # 创建连接 cnx = mysql.connector.connect(user='your_username', password='your_password', host='your_host', database='your_database') # 创建游标 cursor = cnx.cursor() ``` 在上述代码中,需要将 `your_username`、`your_password`、`your_host` 和 `your_database` 替换为你的实际信息。 3. 执行SQL语句:使用游标对象执行SQL语句,例如查询语句: ```python # 执行查询语句 query = "SELECT * FROM your_table" cursor.execute(query) # 获取结果 results = cursor.fetchall() ``` 在上述代码中,需要将 `your_table` 替换为你要查询的实际表名。 4. 对数据进行处理和分析:使用Python中的相关对数据进行处理和分析,例如使用 `pandas` 将查询结果转换为DataFrame对象: ```python import pandas as pd # 将查询结果转换为DataFrame对象 df = pd.DataFrame(results, columns=[i[0] for i in cursor.description]) ``` 在上述代码中,`cursor.description` 可以获取查询结果的字段名,然后将其作为DataFrame对象的列名。 5. 关闭游标和连接使用完毕后需要关闭游标和连接,例如: ```python # 关闭游标和连接 cursor.close() cnx.close() ``` 总之,使用Python进行MySQL数据处理和分析需要先连接MySQL数据库,然后执行SQL语句,获取查询结果后使用相关对数据进行处理和分析,最后关闭游标和连接

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值