Python操作MySQL數(shù)據(jù)庫的兩種方式實(shí)例分析【pymysql和pandas】
本文實(shí)例講述了Python操作MySQL數(shù)據(jù)庫的兩種方式。分享給大家供大家參考,具體如下:
第一種 使用pymysql
代碼如下:
import pymysql #打開數(shù)據(jù)庫連接 db=pymysql.connect(host='1.1.1.1',port=3306,user='root',passwd='123123',db='test',charset='utf8') cursor=db.cursor()#使用cursor()方法獲取操作游標(biāo) sql = "select * from test0811" cursor.execute(sql) info = cursor.fetchall() db.commit() cursor.close() #關(guān)閉游標(biāo) db.close()#關(guān)閉數(shù)據(jù)庫連接
數(shù)據(jù)表test0811的內(nèi)容和上邊的代碼讀出來的內(nèi)容分別是
pymysql是Python操作MySQL數(shù)據(jù)庫的模塊。首先引入pymysql模塊
import pymysql
使用pymysql的connect()方法連接數(shù)據(jù)庫,connect的幾個(gè)參數(shù)解釋如下:
- host:MySQL服務(wù)的地址,若數(shù)據(jù)庫在本地上,使用localhost或者127.0.0.1。如果在其它的服務(wù)器上,應(yīng)該寫IP地址。
- port:服務(wù)的端口號(hào),默認(rèn)為3306,如果不寫,為默認(rèn)值。
- user:登錄數(shù)據(jù)庫的用戶名
- passwd:user賬戶登錄MySQL的密碼
- db:將要操作的數(shù)據(jù)庫的名字
- charset:設(shè)置為utf8編碼,這樣就可以存入漢字沒有亂碼
注意:除了port=3306不用引號(hào),其它項(xiàng)的值都有用引號(hào)括起來
代碼中的db就架起了Python和MySQL通信的橋梁,db.cursor()表示返回連接的游標(biāo)對(duì)象,通過游標(biāo)執(zhí)行SQL語句。還有幾個(gè)常用的方法是commit()表示提交數(shù)據(jù)庫修改,rollback()表示回滾,就是取消當(dāng)前的操作,close()表示關(guān)閉連接。
上面講的是連接對(duì)象db的一些方法,游標(biāo)對(duì)象的一些方法也很重要,利用游標(biāo)對(duì)象的方法就可以對(duì)數(shù)據(jù)庫進(jìn)行操作了,游標(biāo)對(duì)象的常用方法如下表:
名稱 | 描述 |
---|---|
close() | 關(guān)閉游標(biāo),之后游標(biāo)不可用 |
execute(query[,args]) | 執(zhí)行一條SQL語句,可以帶參數(shù) |
executemany(query,pseq) | 對(duì)序列pseq中的每個(gè)參數(shù)執(zhí)行SQL語句 |
fetchone() | 返回一條查詢結(jié)果 |
fetchall() | 返回所有查詢結(jié)果 |
fetchmany([size]) | 返回size條查詢結(jié)果 |
nextset() | 移動(dòng)到下一條結(jié)果 |
scroll(value,mode='relative') | 移動(dòng)游標(biāo)到指定行,如果mode='relative',則表示從當(dāng)前行移動(dòng)value條,如果mode=‘a(chǎn)bsolute',則表示從結(jié)果集的第一行移動(dòng)value條 |
到這里就基本把pymysql的基本用法講清楚了,剩下的對(duì)數(shù)據(jù)庫的操作(增刪改查)就是SQL語句的事情了。雖然SQL語句很強(qiáng)大,但有時(shí)候也會(huì)顯得力不從心,Python的靈活加上SQL的強(qiáng)大才可以做更多的事情,而pymysql只是充當(dāng)工具、橋梁的作用。從代碼運(yùn)行的結(jié)果中(第二幅圖)發(fā)現(xiàn)讀出來的結(jié)果是存放在二維元組中的,即((1, '小紅', '80'),(2, '小明', '90'),(3, '小美', '87'),(4, 'GG', '67'),(5, 'MM', '78')),但是元組不可改變,只能讀出,對(duì)于數(shù)據(jù)處理還有些不便,下面第二種方法就是把數(shù)據(jù)讀出存放在DataFrame中,便于處理。
第二種 使用pandas
代碼如下:
import pandas as pd from sqlalchemy import create_engine from sqlalchemy.types import CHAR,INT connect_info = 'mysql+pymysql://username:passwd@host:3306/dbname?charset=utf8' engine = create_engine(connect_info) #use sqlalchemy to build link-engine sql = "SELECT * FROM test0811" #SQL query df = pd.read_sql(sql=sql, con=engine) #read data to DataFrame 'df' #write df to table 'test1' df.to_sql(name = 'test1', con = engine, if_exists = 'append', index = False, dtype = {'id': INT(), 'name': CHAR(length=2), 'score': CHAR(length=2) } )
pandas的DataFrame數(shù)據(jù)格式有行索引和列索引,使用DataFrame來存儲(chǔ)數(shù)據(jù)庫表中的數(shù)據(jù)會(huì)十分方便。使用pandas中的read_sql和to_sql函數(shù)從MySQL數(shù)據(jù)庫中讀寫數(shù)據(jù)。兩個(gè)函數(shù)介紹如下。
pandas.read_sql
pandas.read_sql的文檔中有詳細(xì)的各個(gè)參數(shù)的英文介紹(不要排斥看英文,虛心向老外學(xué)習(xí)),參考資料http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html
常用的參數(shù)是sql:SQL命令或者表名字,con:連接數(shù)據(jù)庫的引擎,可以用SQLAlchemy或者pymysql建立,從數(shù)據(jù)庫讀數(shù)據(jù)的基本用法給出sql和con就可以了。其它都是默認(rèn)參數(shù),有特殊需求才會(huì)用到,有興趣的話可以查看文檔。
代碼中的con是使用SQLAlchem構(gòu)建數(shù)據(jù)庫連接引擎,即sqlalchemy.create_engine( )。這個(gè)函數(shù)基于一個(gè)URL來產(chǎn)生一個(gè)引擎對(duì)象,URL通常包含了數(shù)據(jù)庫的相關(guān)信息,典型的形式是:
dialect+driver://username:password@host:port/database
dialect表示數(shù)據(jù)庫的名字,比如sqlite,mysql,postgresql,oracle,mssql等,driver是用于連接數(shù)據(jù)庫的DBAPI的名字,這里用的是pymysql(Python 3.x,在Python 2.x中用的是mysqldb),如果這一項(xiàng)不指定,將使用默認(rèn)的DBAPI。
除了使用SQLAlchemy創(chuàng)建engine外,還可以直接使用DBAPI創(chuàng)建engine,代碼如下:
con = pymysql.connect(host=localhost, user=username, password=password, database=dbname, charset='utf8') df = pd.read_sql(sql, con)
pandas.DataFrame.to_sql
主要參數(shù)介紹如下,詳細(xì)文檔參考http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html
- name:輸出的表名
- con:連接數(shù)據(jù)庫的引擎
- if_exists:三種模式{“fail”,“replace”,"append"},默認(rèn)是"fail"。fail:若表存在,引發(fā)一個(gè)ValueError;replace:若表存在,覆蓋原來表內(nèi)數(shù)據(jù);append:若表存在,將數(shù)據(jù)寫到原表數(shù)據(jù)的后面。
- index:是否將DataFrame的index單獨(dú)寫到一列中,默認(rèn)為“True”
- index_label:當(dāng)index為True時(shí),指定列作為DataFrame的index輸出
- dtype:指定列的數(shù)據(jù)類型,字典形式存儲(chǔ){column_name: sql_dtype},常見數(shù)據(jù)類型是sqlalchemy.types.INT()和sqlalchemy.types.CHAR(length=x)。注意:INT和CHAR都需要大寫,INT()不用指定長度。
參考資料:
//chabaoo.cn/article/157984.htm
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html
http://docs.sqlalchemy.org/en/latest/core/engines.html
http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python常見數(shù)據(jù)庫操作技巧匯總》、《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Pycharm中安裝wordcloud等庫失敗問題及終端通過pip安裝的Python庫如何添加到Pycharm解釋器中(
這篇文章主要介紹了Pycharm中安裝wordcloud等庫失敗問題及終端通過pip安裝的Python庫如何添加到Pycharm解釋器中,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-05-05django的分頁器Paginator 從django中導(dǎo)入類
這篇文章主要介紹了django的分頁器Paginator 從django中導(dǎo)入類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python依賴包遷移到斷網(wǎng)環(huán)境操作
這篇文章主要介紹了Python依賴包遷移到斷網(wǎng)環(huán)境操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07用python3 返回鼠標(biāo)位置的實(shí)現(xiàn)方法(帶界面)
今天小編就為大家分享一篇用python3 返回鼠標(biāo)位置的實(shí)現(xiàn)方法(帶界面),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07python針對(duì)Oracle常見查詢操作實(shí)例分析
這篇文章主要介紹了python針對(duì)Oracle常見查詢操作,結(jié)合實(shí)例形式分析了python針對(duì)Oracle常見的子查詢、多表查詢等相關(guān)原理、操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-04-04安裝pytorch報(bào)錯(cuò)torch.cuda.is_available()=false問題的解決過程
最近想用pytorch,因此裝了pytorch,但是碰到了問題,下面這篇文章主要給大家介紹了關(guān)于安裝pytorch報(bào)錯(cuò)torch.cuda.is_available()=false問題的解決過程,需要的朋友可以參考下2022-05-05Python分支結(jié)構(gòu)(switch)操作簡介
這篇文章主要介紹了Python分支結(jié)構(gòu)(switch)操作簡介,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01