Python操作mysql數(shù)據(jù)庫的兩種方式

一、使用pymsql庫

pymysql是Python操作MySQL數(shù)據(jù)庫的模塊。

import pymysql

使用pymysql的connect()方法建立與mysql數(shù)據(jù)庫的連接:conn=pymsql.connect()

connect方法的主要參數(shù)如下:
host:連接的mysql主機(jī),如果本機(jī)是'localhost';IP地址
port:連接的mysql主機(jī)的端口,默認(rèn)是3306
db:數(shù)據(jù)庫的名稱
user:連接的用戶名
password:連接的密碼
charset:通信采用的編碼方式,要求與數(shù)據(jù)庫創(chuàng)建時(shí)指定的編碼一致,否則中文會亂碼

connect方法返回的conn是一個(gè)Connection對象

Connection對象擁有如下方法:
close()關(guān)閉連接
commit()事務(wù),提交之前的操作,使生效!
rollback()事務(wù),放棄之前的操作
cursor()返回Cursor對象,用于執(zhí)行sql語句并獲得結(jié)果。Cursor:游標(biāo)對象
注意:pymysql操作數(shù)據(jù)庫默認(rèn)開啟事物功能


調(diào)用Connection對象的cursor()方法,返回Cursor對象,然后就可以執(zhí)行sql語句,操作數(shù)據(jù)庫。
cursor=conn.cursor() # 返回是元組形式的數(shù)據(jù)(默認(rèn))
cursor = conn.cursor( cursor=pymysql.cursors.DictCursor ) # 指定返回字典形式的數(shù)據(jù)

Cursor對象的方法:
close():關(guān)閉游標(biāo)
execute(operation [, parameters ]):執(zhí)行sql語句,返回受影響的行數(shù)。
##########################################
按照游標(biāo)的位置往后取值,游標(biāo)默認(rèn)位置:0
fetchone():執(zhí)行查詢語句時(shí),獲取查詢結(jié)果集的第一個(gè)行數(shù)據(jù),返回一個(gè)元組。
fetchmany(n):執(zhí)行查詢語句時(shí),獲取查詢結(jié)果集的N行數(shù)據(jù)。
fetchall():執(zhí)行查詢時(shí),獲取結(jié)果集的所有行,一行構(gòu)成一個(gè)元組,再將這些元組裝入一個(gè)元組返回。
##########################################
控制游標(biāo)的位置:
scroll(value[,mode]):將游標(biāo)移動(dòng)到某個(gè)位置
mode表示移動(dòng)的方式:relative(默認(rèn))或absolute。
mode的默認(rèn)值為relative,表示基于當(dāng)前行位置移動(dòng)到value,value為正,則向下移動(dòng),value為負(fù),則向上移動(dòng)。
mode的值為absolute,表示基于第一條數(shù)據(jù)的位置,第一條數(shù)據(jù)的位置為0。

Cursor對象的屬性:
rowcount:只讀屬性,表示最近一次execute()執(zhí)行后受影響的行數(shù)
connection:獲得當(dāng)前連接對象

示例代碼:

import pymysql

param = {
    'host':'localhost',
    'port':3306,
    'db':'tp',
    'user':'root',
    'password':'dao0206',
    'charset':'utf8',
}
conn = pymysql.connect(**param)   #連接對象
cur = conn.cursor()   #游標(biāo)對象,采用默認(rèn)的數(shù)據(jù)格式

cur.execute("SELECT * FROM test")   #執(zhí)行sql語句,返回受影響的行數(shù)
cur.fetchall()   #獲取查詢結(jié)果

# %s:占位符
# params:增加內(nèi)容的列表或元組,多條語句可以使用嵌套
sql = "insert into test values(%s,%s)"
params = (1221,"小強(qiáng)")
cur.execute(sql, params)   #sql語句參數(shù)化,防止攻擊!

# pymysql連接數(shù)據(jù)庫默認(rèn)開啟事物,提交之前的操作,使生效!
conn.commit()

# 要及時(shí)關(guān)閉連接!
cur.close()  #關(guān)閉游標(biāo)
conn.close()  #關(guān)閉連接

注意:
雖然可以使用cur.execute執(zhí)行create table等語句
但建議在開發(fā)之初,就創(chuàng)建好數(shù)據(jù)庫表結(jié)構(gòu),然后再將數(shù)據(jù)追加到表中。


二、使用pandas庫

pandas的DataFrame數(shù)據(jù)格式與數(shù)據(jù)庫中的表非常相似,使用pandas來操作數(shù)據(jù)庫非常方便,特別是數(shù)據(jù)較大時(shí)。
使用pandas中的read_sql和to_sql函數(shù)可以便捷的從數(shù)據(jù)庫中讀寫數(shù)據(jù),下面以mysql數(shù)據(jù)庫為例。

1. read_sql函數(shù):主要用于從數(shù)據(jù)庫中讀取數(shù)據(jù),可以執(zhí)行sql語句或直接讀取整張表。

主要參數(shù):

  • sql:sql語句 或 數(shù)據(jù)庫表名
  • con:數(shù)據(jù)庫連接引擎
  • index_col:將某列設(shè)置為索引,默認(rèn)None
  • parse_dates :將列解析為日期格式,列表或字典
  • columns:需要選取的列(當(dāng)sql參數(shù)為表名時(shí))
  • chunksize:指定每次迭代返回的塊大?。ǚ祷氐氖堑鳎?/li>

2. to_sql函數(shù):主要用于將dataframe數(shù)據(jù)寫入數(shù)據(jù)庫。

主要參數(shù):

  • name :數(shù)據(jù)庫的表名
  • con:數(shù)據(jù)庫連接引擎
  • if_exists:三種模式{“fail”,“replace”,"append"}。fail(默認(rèn)):若表存在,引發(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í),指定列標(biāo)簽。
  • chunksize:批處理的大小,迭代寫入。
  • dtype:指定列的數(shù)據(jù)類型,字典形式存儲{column_name: sql_dtype}。常見數(shù)據(jù)類型是sqlalchemy.types.INT()和sqlalchemy.types.CHAR(length=x)。注意:INT和CHAR都需要大寫,INT()不用指定長度。

3. con參數(shù):數(shù)據(jù)庫連接引擎
python的sqlalchemy模塊提供了create_engine()函數(shù)用來初始化數(shù)據(jù)庫連接(默認(rèn)不開啟事物功能),sqlalchemy用一個(gè)字符串表示連接信息:'數(shù)據(jù)庫名+數(shù)據(jù)庫驅(qū)動(dòng)://用戶名:口令@ip地址:端口號/數(shù)據(jù)庫名?charset=utf8'

主要參數(shù):

  • 數(shù)據(jù)庫名:mysql,postgresql,oracle,sqlite等。
  • 數(shù)據(jù)庫驅(qū)動(dòng):用于連接數(shù)據(jù)庫的DBAPI的名字,mysql數(shù)據(jù)庫使用的就是pymysql,如果這一項(xiàng)不指定,將使用默認(rèn)的DBAPI。

4. 示例代碼:

import pandas as pd
from sqlalchemy import create_engine

# 數(shù)據(jù)庫連接引擎
engine = create_engine('mysql+pymysql://root:passwd@localhost:3306/database?charset=utf8', encoding='utf-8')

####### 讀 #######
sql = ''' select name age from student where gender='男'; '''    # sql查詢語句
df = pd.read_sql(sql, con = engine)    #執(zhí)行sql語句,讀取數(shù)據(jù)
print(type(df), df)   #輸出dataframe數(shù)據(jù)

####### 寫 #######
df = pd.DataFrame({'id': [1, 2, 3, 4], 'name': ['zhangsan', 'lisi', 'wangwu', 'zhuliu']})
df.to_sql('test', engine, if_exists='append')   #將dataframe數(shù)據(jù)最加到數(shù)據(jù)庫test表
print("Write to MySQL successfully!")

另外:engine.execute(sql)可以直接執(zhí)行sql語句

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:passwd@localhost:3306/database?charset=utf8', encoding='utf-8')
sql = "DROP TABLE IF EXISTS test"
engine.execute(sql)

sql = "SELECT * FROM test"
result = engine.execute(sql).fetchall() 
print(result)   #返回一個(gè)列表,列表中的每個(gè)元組都是一條記錄。

參考文獻(xiàn):
Python操作MySQL數(shù)據(jù)庫的兩種方式pymysql和pandas
Python之使用Pandas庫實(shí)現(xiàn)MySQL數(shù)據(jù)庫的讀寫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容