用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 sqlalchemy

The 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

其中,pandas模块提供了read_sql_query()函数实现了对数据库的查询,to_sql()函数实现了对数据库的写入,并不需要实现新建MySQL数据表。sqlalchemy模块实现了与不同数据库的连接,而pymysql模块则使得Python能够操作MySQL数据库。
我们将使用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!')
   id    name  level  upid
0   1     北京市      1     0
1   2     天津市      1     0
2   3     河北省      1     0
3   4     山西省      1     0
4   5  内蒙古自治区      1     0
5   6     辽宁省      1     0
6   7     吉林省      1     0
7   8    黑龙江省      1     0
8   9     上海市      1     0
9  10     江苏省      1     0
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行如下:

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
# -*- 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

参数
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传统模式的字符串。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容