用Pandas库实现MySQL数据库的读写
用Pandas库实现MySQL数据库的读写
ORM技术
对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是把关系数据库的表结构映射到对象上,通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
在Python中,最有名的ORM框架是SQLAlchemy。Java中典型的ORM中间件有: Hibernate, ibatis, speedframework。
SQLAlchemy
SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行。
可以使用pip命令安装SQLAlchemy模块:
pip install sqlalchemy
The following command must be run outside of the IPython shell:$ pip install sqlalchemyThe Python package manager (pip) can only be used from outside of IPython.
Please reissue the `pip` command in a separate terminal or command prompt.See the Python documentation for more information on how to install packages:https://docs.python.org/3/installing/
SQLAlchemy模块提供了create_engine()函数用来初始化数据库连接,SQLAlchemy用一个字符串表示连接信息:
数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
Pandas读写MySQL数据库 我们需要以下三个库来实现Pandas读写MySQL数据库:
- pandas
- sqlalchemy
- pymysql
我们将使用MySQL数据库中的mydb数据库以及myadmin_cityse表,内容如下:
mysql> select * from myadmin_citys limit 10;
+----+--------------------+-------+------+
| id | name| level | upid |
+----+--------------------+-------+------+
|1 | 北京市|1 |0 |
|2 | 天津市|1 |0 |
|3 | 河北省|1 |0 |
|4 | 山西省|1 |0 |
|5 | 内蒙古自治区|1 |0 |
|6 | 辽宁省|1 |0 |
|7 | 吉林省|1 |0 |
|8 | 黑龙江省|1 |0 |
|9 | 上海市|1 |0 |
| 10 | 江苏省|1 |0 |
+----+--------------------+-------+------+
10 rows in set (0.00 sec)
下面将介绍一个简单的例子来展示如何在pandas中实现对MySQL数据库的读写:
# -*- coding: utf-8 -*-# 导入必要模块
import pandas as pd
from sqlalchemy import create_engine# 初始化数据库连接,使用pymysql模块
# MySQL的用户:root, 密码:123456, 端口:3306,数据库:mydb
engine = create_engine('mysql+pymysql://root:123456@192.168.81.134:3306/shopdb')# 查询语句,选出employee表中的所有数据
sql = '''
select * from myadmin_citys limit 10;
'''# read_sql_query的两个参数: sql语句, 数据库连接
df = pd.read_sql_query(sql, engine)# 输出employee表的查询结果
print(df)# 新建pandas中的DataFrame, 只有id,num两列
df = pd.DataFrame({'id':[1,2,3,4],'num':[12,34,56,89]})# 将新建的DataFrame储存为MySQL中的数据表,不储存index列
df.to_sql('mydf', engine, index= False)print('Read from and write to Mysql table successfully!')
idnamelevelupid
01北京市10
12天津市10
23河北省10
34山西省10
45内蒙古自治区10
56辽宁省10
67吉林省10
78黑龙江省10
89上海市10
910江苏省10
Read from and write to Mysql table successfully!
在MySQL中查看mydf表格:
mysql> select * from mydf;
+------+------+
| id| num|
+------+------+
|1 |12 |
|2 |34 |
|3 |56 |
|4 |89 |
+------+------+
4 rows in set (0.00 sec)
这说明我们确实将pandas中新建的DataFrame写入到了MySQL中
将CSV文件写入到MySQL中 以上的例子实现了使用Pandas库实现MySQL数据库的读写,我们将再介绍一个实例:将CSV文件写入到MySQL中,示例的california_housing_test.csv文件前10行如下:
longitudelatitudehousing_median_agetotal_rooms total_bedroomspopulationhouseholdsmedian_incomemedian_house_value
-122.05 37.37273885661 1537606 6.6085344700
-118.334.26431510310 809 277 3.599176500
-117.81 33.78273589507 1484495 5.7934270500
-118.36 33.8228671549116.1359330000
-119.67 36.33191241244 850 237 2.937581700
-119.56 36.51371018213 663 204 1.663567000
-121.43 38.63431009225 604 218 1.664167000
-120.65 35.48192310471 1341441 3.225166900
-122.84 38.4153080617 1446599 3.6696194400
-118.02 34.08312402632 2830603 2.3333164200
# -*- coding: utf-8 -*-# 导入必要模块
import pandas as pd
from sqlalchemy import create_engine# 初始化数据库连接,使用pymysql模块
engine = create_engine('mysql+pymysql://root:123456@192.168.81.134:3306/shopdb')# 读取本地CSV文件
df = pd.read_csv("D:\Desktop\california_housing_test.csv", sep=',')# 将新建的DataFrame储存为MySQL中的数据表,不储存index列
df.to_sql('mpg', engine, index= False)print("Write to MySQL successfully!")
Write to MySQL successfully!
在MySQL中查看mpg表格:
mysql> select * from mpg limit 10;
+-----------+----------+--------------------+-------------+----------------+------------+------------+---------------+--------------------+
| longitude | latitude | housing_median_age | total_rooms | total_bedrooms | population | households | median_income | median_house_value |
+-----------+----------+--------------------+-------------+----------------+------------+------------+---------------+--------------------+
|-122.05 |37.37 |27 |3885 |661 |1537 |606 |6.6085 |344700 |
|-118.3 |34.26 |43 |1510 |310 |809 |277 |3.599 |176500 |
|-117.81 |33.78 |27 |3589 |507 |1484 |495 |5.7934 |270500 |
|-118.36 |33.82 |28 |67 |15 |49 |11 |6.1359 |330000 |
|-119.67 |36.33 |19 |1241 |244 |850 |237 |2.9375 |81700 |
|-119.56 |36.51 |37 |1018 |213 |663 |204 |1.6635 |67000 |
|-121.43 |38.63 |43 |1009 |225 |604 |218 |1.6641 |67000 |
|-120.65 |35.48 |19 |2310 |471 |1341 |441 |3.225 |166900 |
|-122.84 |38.4 |15 |3080 |617 |1446 |599 |3.6696 |194400 |
|-118.02 |34.08 |31 |2402 |632 |2830 |603 |2.3333 |164200 |
+-----------+----------+--------------------+-------------+----------------+------------+------------+---------------+--------------------+
10 rows in set (0.00 sec)
仅仅5句Python代码就实现了将CSV文件写入到MySQL中,这无疑是简单、方便、迅速、高效的!
DataFrame.to_sql 的相关参数 DataFrame.to_sql(name,con,schema = None,if_exists ='fail',index = True,index_label = None,chunksize = None,dtype = None,method = None
【用Pandas库实现MySQL数据库的读写】参数:
name : stringSQL表的名称。
con : sqlalchemy.engine.Engine或sqlite3.Connection使用SQLAlchemy可以使用该库支持的任何数据库。为sqlite3.Connection对象提供了旧版支持。
schema : string,optional指定模式(如果数据库flavor支持此模式)。如果为None,请使用默认架构。
if_exists : {'fail','replace','append'},默认'fail'
如果表已存在,如何表现。
fail:引发ValueError。
replace:在插入新值之前删除表。
append:将新值插入现有表。
index : bool,默认为True将DataFrame索引写为列。使用index_label作为表中的列名。
index_label : 字符串或序列,默认为None索引列的列标签。如果给出None(默认值)且 index为True,则使用索引名称。如果DataFrame使用MultiIndex,则应该给出一个序列。
chunksize : int,可选行将一次批量写入此大小。默认情况下,所有行都将立即写入。
dtype : dict,可选指定列的数据类型。键应该是列名,值应该是SQLAlchemy类型或sqlite3传统模式的字符串。
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 太平之莲
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询