1. 程式人生 > 資料庫 >Python操作MySQL資料庫的兩種方式例項分析【pymysql和pandas】

Python操作MySQL資料庫的兩種方式例項分析【pymysql和pandas】

本文例項講述了Python操作MySQL資料庫的兩種方式。分享給大家供大家參考,具體如下:

第一種 使用pymysql

程式碼如下:

import pymysql
#開啟資料庫連線
db=pymysql.connect(host='1.1.1.1',port=3306,user='root',passwd='123123',db='test',charset='utf8')
cursor=db.cursor()#使用cursor()方法獲取操作遊標
sql = "select * from test0811"
cursor.execute(sql)
info = cursor.fetchall()
db.commit()
cursor.close() #關閉遊標
db.close()#關閉資料庫連線

資料表test0811的內容和上邊的程式碼讀出來的內容分別是

pymysql是Python操作MySQL資料庫的模組。首先引入pymysql模組

import pymysql

使用pymysql的connect()方法連線資料庫,connect的幾個引數解釋如下:

  • host:MySQL服務的地址,若資料庫在本地上,使用localhost或者127.0.0.1。如果在其它的伺服器上,應該寫IP地址。
  • port:服務的埠號,預設為3306,如果不寫,為預設值。
  • user:登入資料庫的使用者名稱
  • passwd:user賬戶登入MySQL的密碼
  • db:將要操作的資料庫的名字
  • charset:設定為utf8編碼,這樣就可以存入漢字沒有亂碼

注意:除了port=3306不用引號,其它項的值都有用引號括起來

程式碼中的db就架起了Python和MySQL通訊的橋樑,db.cursor()表示返回連線的遊標物件,通過遊標執行SQL語句。還有幾個常用的方法是commit()表示提交資料庫修改,rollback()表示回滾,就是取消當前的操作,close()表示關閉連線。

上面講的是連線物件db的一些方法,遊標物件的一些方法也很重要,利用遊標物件的方法就可以對資料庫進行操作了,遊標物件的常用方法如下表:

名稱 描述
close() 關閉遊標,之後遊標不可用
execute(query[,args]) 執行一條SQL語句,可以帶引數
executemany(query,pseq) 對序列pseq中的每個引數執行SQL語句
fetchone() 返回一條查詢結果
fetchall() 返回所有查詢結果
fetchmany([size]) 返回size條查詢結果
nextset() 移動到下一條結果
scroll(value,mode='relative') 移動遊標到指定行,如果mode='relative',則表示從當前行移動value條,如果mode=‘absolute',則表示從結果集的第一行移動value條

到這裡就基本把pymysql的基本用法講清楚了,剩下的對資料庫的操作(增刪改查)就是SQL語句的事情了。雖然SQL語句很強大,但有時候也會顯得力不從心,Python的靈活加上SQL的強大才可以做更多的事情,而pymysql只是充當工具、橋樑的作用。從程式碼執行的結果中(第二幅圖)發現讀出來的結果是存放在二維元組中的,即((1,'小紅','80'),(2,'小明','90'),(3,'小美','87'),(4,'GG','67'),(5,'MM','78')),但是元組不可改變,只能讀出,對於資料處理還有些不便,下面第二種方法就是把資料讀出存放在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資料格式有行索引和列索引,使用DataFrame來儲存資料庫表中的資料會十分方便。使用pandas中的read_sql和to_sql函式從MySQL資料庫中讀寫資料。兩個函式介紹如下。

pandas.read_sql
複製程式碼 程式碼如下:pandas.read_sql(sql,con,index_col=None,coerce_float=True,params=None,parse_dates=None,columns=None,chunksize=None)
pandas.read_sql的文件中有詳細的各個引數的英文介紹(不要排斥看英文,虛心向老外學習),參考資料http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_sql.html

常用的引數是sql:SQL命令或者表名字,con:連線資料庫的引擎,可以用SQLAlchemy或者pymysql建立,從資料庫讀資料的基本用法給出sql和con就可以了。其它都是預設引數,有特殊需求才會用到,有興趣的話可以檢視文件。

程式碼中的con是使用SQLAlchem構建資料庫連線引擎,即sqlalchemy.create_engine( )。這個函式基於一個URL來產生一個引擎物件,URL通常包含了資料庫的相關資訊,典型的形式是:

dialect+driver://username:password@host:port/database

dialect表示資料庫的名字,比如sqlite,mysql,postgresql,oracle,mssql等,driver是用於連線資料庫的DBAPI的名字,這裡用的是pymysql(Python 3.x,在Python 2.x中用的是mysqldb),如果這一項不指定,將使用預設的DBAPI。

除了使用SQLAlchemy建立engine外,還可以直接使用DBAPI建立engine,程式碼如下:

con = pymysql.connect(host=localhost,user=username,password=password,database=dbname,charset='utf8')
df = pd.read_sql(sql,con)

pandas.DataFrame.to_sql
複製程式碼 程式碼如下:DataFrame.to_sql(name,schema=None,if_exists='fail',index=True,index_label=None,chunksize=None,dtype=None)
主要引數介紹如下,詳細文件參考http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html

  • name:輸出的表名
  • con:連線資料庫的引擎
  • if_exists:三種模式{“fail”,“replace”,"append"},預設是"fail"。fail:若表存在,引發一個ValueError;replace:若表存在,覆蓋原來表內資料;append:若表存在,將資料寫到原表資料的後面。
  • index:是否將DataFrame的index單獨寫到一列中,預設為“True”
  • index_label:當index為True時,指定列作為DataFrame的index輸出
  • dtype:指定列的資料型別,字典形式儲存{column_name: sql_dtype},常見資料型別是sqlalchemy.types.INT()和sqlalchemy.types.CHAR(length=x)。注意:INT和CHAR都需要大寫,INT()不用指定長度。

參考資料:

//www.jb51.net/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

更多關於Python相關內容感興趣的讀者可檢視本站專題:《Python常見資料庫操作技巧彙總》、《Python數學運算技巧總結》、《Python資料結構與演算法教程》、《Python函式使用技巧總結》、《Python字串操作技巧彙總》、《Python入門與進階經典教程》及《Python檔案與目錄操作技巧彙總》

希望本文所述對大家Python程式設計有所幫助。