Python使用Pandas庫(kù)實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的讀寫
本次分享將介紹如何在Python中使用Pandas庫(kù)實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的讀寫。首先我們需要了解點(diǎn)ORM方面的知識(shí)
ORM技術(shù)
對(duì)象關(guān)系映射技術(shù),即ORM(Object-Relational Mapping)技術(shù),指的是把關(guān)系數(shù)據(jù)庫(kù)的表結(jié)構(gòu)映射到對(duì)象上,通過使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。
在Python中,最有名的ORM框架是SQLAlchemy。Java中典型的ORM中間件有:Hibernate,ibatis,speedframework。
SQLAlchemy
SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對(duì)象關(guān)系映射(ORM)工具,使用MIT許可證發(fā)行
SQLAlchemy模塊提供了create_engine()函數(shù)用來初始化數(shù)據(jù)庫(kù)連接,SQLAlchemy用一個(gè)字符串表示連接信息:
'數(shù)據(jù)庫(kù)類型+數(shù)據(jù)庫(kù)驅(qū)動(dòng)名稱://用戶名:口令@機(jī)器地址:端口號(hào)/數(shù)據(jù)庫(kù)名
Pandas讀寫MySQL數(shù)據(jù)庫(kù)
我們需要以下三個(gè)庫(kù)來實(shí)現(xiàn)Pandas讀寫MySQL數(shù)據(jù)庫(kù):
- pandas
- sqlalchemy
- pymysql
其中,pandas模塊提供了read_sql_query()函數(shù)實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的查詢,to_sql()函數(shù)實(shí)現(xiàn)了對(duì)數(shù)據(jù)庫(kù)的寫入。并不需要實(shí)現(xiàn)新建MySQL數(shù)據(jù)表。
sqlalchemy模塊實(shí)現(xiàn)了與不同數(shù)據(jù)庫(kù)的連接,而pymysql模塊則使得Python能夠操作MySQL數(shù)據(jù)庫(kù)。
我們將使用MySQL數(shù)據(jù)庫(kù)中的mydb數(shù)據(jù)庫(kù)以及employee表,內(nèi)容如下:

注意:
1.根據(jù)庫(kù)的文檔,我們看到to_sql函數(shù)支持兩類mysql引擎一個(gè)是sqlalchemy,另一個(gè)是sqlliet3.沒錯(cuò),在你寫入庫(kù)的時(shí)候,pymysql是不能用的?。?!
mysqldb也是不能用的,你只能使用sqlalchemy或者sqlliet3?。¤b于sqllift3已經(jīng)很久沒有更新了,筆者這里建議使用sqlalchemy??!
2.to_sql函數(shù)并不在pd之中,而是在io.sql之中,是sql腳本下的一個(gè)類?。。∷詔o_sql的最好寫法就是:
pd.io.sql.to_sql(df1,tablename,con=conn,if_exists='repalce')
下面將介紹一個(gè)簡(jiǎn)單的例子來展示如何在pandas中實(shí)現(xiàn)對(duì)MySQL數(shù)據(jù)庫(kù)的讀寫:
import pandas as pd
from sqlalchemy import create_engine
# 初始化數(shù)據(jù)庫(kù)連接,使用pymysql模塊
# MySQL的用戶:root, 密碼:147369, 端口:3306,數(shù)據(jù)庫(kù):test
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
# 查詢語句,選出employee表中的所有數(shù)據(jù)
sql = ''' select * from employee; '''
# read_sql_query的兩個(gè)參數(shù): sql語句, 數(shù)據(jù)庫(kù)連接
df = pd.read_sql_query(sql, engine)
# 輸出employee表的查詢結(jié)果
print(df)
# 新建pandas中的DataFrame, 只有id,num兩列
df = pd.DataFrame({'id': [1, 2, 3, 4], 'name': ['zhangsan', 'lisi', 'wangwu', 'zhuliu']})
# 將新建的DataFrame儲(chǔ)存為MySQL中的數(shù)據(jù)表,儲(chǔ)存index列
df.to_sql('mydf', engine, index=True)
print('Read from and write to Mysql table successfully!')
運(yùn)行結(jié)果:

這說明我們確實(shí)將pandas中新建的DataFrame寫入到了MySQL中!
將CSV文件寫入到MySQL中
以上的例子實(shí)現(xiàn)了使用Pandas庫(kù)實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的讀寫,我們將再介紹一個(gè)實(shí)例:將CSV文件寫入到MySQL中,示例的example.csv文件如下

示例的Python代碼如下:
# -*- coding: utf-8 -*-
# 導(dǎo)入必要模塊
import pandas as pd
from sqlalchemy import create_engine
# 初始化數(shù)據(jù)庫(kù)連接,使用pymysql模塊
db_info = {'user': 'root',
'password': '123456',
'host': 'localhost',
'port': 3306,
'database': 'test'
}
engine = create_engine('mysql+pymysql://%(user)s:%(password)s@%(host)s:%(port)d/%(database)s?charset=utf8' % db_info, encoding='utf-8')
# 直接使用下一種形式也可以
# engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
# 讀取本地CSV文件
df = pd.read_csv("C:/Users/fuqia/Desktop/example.csv", sep=',')
print(df)
# 將新建的DataFrame儲(chǔ)存為MySQL中的數(shù)據(jù)表,不儲(chǔ)存index列(index=False)
# if_exists:
# 1.fail:如果表存在,啥也不做
# 2.replace:如果表存在,刪了表,再建立一個(gè)新表,把數(shù)據(jù)插入
# 3.append:如果表存在,把數(shù)據(jù)插入,如果表不存在創(chuàng)建一個(gè)表!!
pd.io.sql.to_sql(df, 'example', con=engine, index=False, if_exists='replace')
# df.to_sql('example', con=engine, if_exists='replace')這種形式也可以
print("Write to MySQL successfully!")
在MySQL中查看example表格

補(bǔ)充:engine.execute(sql)可以直接執(zhí)行sql語句:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
sql = "DROP TABLE IF EXISTS example"
engine.execute(sql)
如果用pymysql,則必須用cursor,讀者可以對(duì)比一下。
import pymysql
from sqlalchemy import create_engine
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='test')
# engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
sql = "DROP TABLE IF EXISTS test_input"
cursor = conn.cursor()
cursor.execute(sql)
總結(jié)
本文主要介紹了ORM技術(shù)以及SQLAlchemy模塊,并且展示了兩個(gè)Python程序的實(shí)例,介紹了如何使用Pandas庫(kù)實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的讀寫。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
兩個(gè)命令把 Vim 打造成 Python IDE的方法
這篇文章主要介紹了兩個(gè)命令把 Vim 打造成 Python IDE,需要的朋友可以參考下2016-03-03
使用grpc實(shí)現(xiàn)golang后端和python服務(wù)間通信
gRPC是Google 開發(fā)的高性能、開源的遠(yuǎn)程過程調(diào)用(RPC)框架,本文主要為大家詳細(xì)介紹了如何使用grpc實(shí)現(xiàn)golang后端和python服務(wù)間通信,感興趣的可以了解下2024-03-03
基于Python實(shí)現(xiàn)人臉自動(dòng)戴口罩系統(tǒng)
2019年新型冠狀病毒感染的肺炎疫情發(fā)生以來,牽動(dòng)人心,舉國(guó)哀痛,口罩、酒精、消毒液奇貨可居。這篇文章主要介紹了基于Python的人臉自動(dòng)戴口罩系統(tǒng),需要的朋友可以參考下2020-02-02
解決Pytorch中的神坑:關(guān)于model.eval的問題
這篇文章主要介紹了解決Pytorch中的神坑:關(guān)于model.eval的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python虛擬環(huán)境Virtualenv使用教程
這篇文章主要介紹了Python虛擬環(huán)境Virtualenv簡(jiǎn)明教程,本文整合了兩篇關(guān)于Virtualenv的使用教程,相信大家有通過本文一定可以學(xué)會(huì)如何使用Virtualenv,需要的朋友可以參考下2015-05-05
利用Jmeter實(shí)現(xiàn)在請(qǐng)求param和body里面加入隨機(jī)參數(shù)
本文介紹了如何使用jemeter實(shí)現(xiàn)新增接口壓力測(cè)試中的隨機(jī)參數(shù)生成,首先,使用函數(shù)助手對(duì)話框生成隨機(jī)數(shù),然后將生成的隨機(jī)數(shù)作為參數(shù)放入請(qǐng)求中,無論請(qǐng)求格式是json、xml還是text等,如果param和body同時(shí)存在并需要隨機(jī)生成參數(shù),可以把參數(shù)寫入到請(qǐng)求地址中2024-10-10
Python+Selenium實(shí)現(xiàn)無頭瀏覽器網(wǎng)頁(yè)截圖
這篇文章主要為大家詳細(xì)介紹了Python+Selenium實(shí)現(xiàn)無頭瀏覽器網(wǎng)頁(yè)截圖的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03

