使用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, engine)
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

使用第三方库连接MySql数据库:PyMysql库和Pandas库的更多相关文章

  1. Robotframework使用自写库连接mysql数据库

    Robotframework使用自写库连接mysql数据库 新建库文件mysqltest.py 代码如下: # -*- coding: utf-8 -*- import MySQLdbimport o ...

  2. Python 使用PyMySql 库 连接MySql数据库时 查询中文遇到的乱码问题(实测可行) python 连接 MySql 中文乱码 pymysql库

    最近所写的代码中需要用到python去连接MySql数据库,因为是用PyQt5来构建的GUI,原本打算使用PyQt5中的数据库连接方法,后来虽然能够正确连接上发现还是不能提交修改内容,最后在qq交流群 ...

  3. 【Python + Mysql】之用pymysql库连接Mysql数据库并进行增删改查操作

    用pip下载pymysql并引用 具体请参考文章: <Python之MySQL数据库增删改查操作> <python3.6 使用 pymysql 连接 Mysql 数据库及 简单的增删 ...

  4. 使用python连接mysql数据库——pymysql模块的使用

    安装pymysql pip install pymysql 使用pymysql 使用数据查询语句 查询一条数据fetchone() from pymysql import * conn = conne ...

  5. Python连接MySQL数据库(pymysql的使用)

    本文Python版本3.5.3,mysq版本5.7.23 基本使用 # 导入pymysql模块 import pymysql #连接数据库 conn = pymysql.connect( databa ...

  6. nodejs进阶(6)—连接MySQL数据库

    1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...

  7. JAVA-数据库之JDBC连接MySQL数据库

    相关资料:<21天学通Java Web开发> JDBC连接MySQL数据库1.如果需要通过JDBC来连接MySQL数据库,还必须先在MySQL数据库服务器中创建数据库和表. Connect ...

  8. Mysql(九):Python连接MySQL数据库之pymysql模块使用

    Python3连接MySQL 本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用. PyMySQL介绍 PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服 ...

  9. Python连接MySQL数据库之pymysql模块使用

    安装PyMySQL pip install pymysql PyMySQL介绍 PyMySQL是在python3.x版本中用于连接MySQL服务器的一个库,2中则使用mysqldb. Django中也 ...

随机推荐

  1. FPGA学习的一点总结

    做FPGA主要是要有电路的思想,作为初学者,往往对器件可能不是熟悉,那么应该要对数字电路的知识熟悉. FPGA中是由触发器和查找表以及互联线等基本结构组成的,其实在逻辑代码里面能够看到的就是与非门以及 ...

  2. Python库-re(正则表达式)

    re库是python的一个标准库,不需要自己用pip额外下载,直接调用即可. 下面介绍以下库中函数的作用. 1.re.compile(patter, flags=0) patter是一个正则表达式字符 ...

  3. (转)Inno Setup入门(二十)——Inno Setup类参考(6)

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17251041 存储框 存储框也是典型的窗口可视化组件,同编辑框类似, ...

  4. dom4j使用的小例子

    product.xml: <?xml version="1.0" encoding="UTF-8"?> <root> <produ ...

  5. IJ

    ylbtech-IJ: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   10.返回 ...

  6. 自己设计代理IP池

    大体思路 使用redis作为队列,买了一份蘑菇代理,但是这个代理每5秒可以请求一次,我们将IP请求出来,从redis列表队列的左侧插入,要用的时候再从右侧取出,请求成功证明该IP是可用的,将该代理IP ...

  7. Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)

    Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建) 具体案例:局域网内有两台主机,一台Linux.一台Windows,现在需要配置一台Cacti监控服务器对这两台 ...

  8. 【转】几款移动跨平台App开发框架比较

    原文地址:https://www.cnblogs.com/songxingzheng/p/6482697.html 整理目前流行的跨平台WebApp开发技术的特点,仅供参考. 每个框架几乎都包含以下特 ...

  9. scrapy框架的持久化存储

    一 . 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. 执行输出指定格式进行存 ...

  10. TCP报文大小

    链路层(二层)MTU最大传输单元:1500KByte.每个以太网帧64bytes-1518bytes,减去帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Byt ...