數據分析離不開數據庫,如何使用python連接MySQL數據庫,並進行增刪改查操作呢?
我們還會遇到需要將大批量數據導入數據庫的情況,又該如何使用Python進行大數據的高效導入呢?
本文會一一講解,並配合代碼和實例。
一、背景
我是在Anaconda notebook中進行連接實驗的,環境Python3.6,當然也可以在Python Shell里面進行操作。
最常用也最穩定的用於連接MySQL數據庫的python庫是PyMySQL。
所以本文討論的是利用PyMySQL連接MySQL數據庫,進行增刪改查操作,以及存儲大批量數據。
方法參考PyMySQL官方文檔和《python數據采集》關於數據存儲的部分。
歡迎大家去閱讀原文檔,相信會理解的更加透徹。
二、基本操作
1、安裝PyMySQL庫
最簡單的方式:
在命令行輸入 pip install pymysql
或者:
下載whl文件進行安裝,安裝過程自行百度。
2、安裝MySQL數據庫
類MySQL數據庫有兩種:MySQL和MariaDB,我用的是后者MariaDB。
兩者在絕大部分性能上是兼容的,使用起來感覺不到啥區別。
給出下載地址:MySQL,MariaDB,安裝過程很簡單,一路Next Step,不過要記好密碼。
有個小插曲,MySQL和MariaDB相當於姐姐妹妹的關系,兩者由同一個人(Widenius)創建的。MySQL被Oracle收購后,Widenius先生覺得不爽,於是搞了個MariaDB,可以完全替代MySQL。大牛就是任性。
3、SQL基本語法
下面要用SQL的表創建、查詢、數據插入等功能,這里簡要介紹一下SQL語言的基本語句。
-
查看數據庫:
SHOW DATABASES; -
創建數據庫:
CREATE DATEBASE 數據庫名稱; -
使用數據庫:
USE 數據庫名稱; -
查看數據表:
SHOW TABLES; -
創建數據表:
CREATE TABLE 表名稱(列名1 (數據類型1),列名2 (數據類型2)); -
插入數據:
INSERT INTO 表名稱(列名1,列名2) VALUES(數據1,數據2); -
查看數據:
SELECT * FROM 表名稱; -
更新數據:
UPDATE 表名稱 SET 列名1=新數據1,列名2=新數據2 WHERE 某列=某數據;
4、連接數據庫
安裝好必要得文件和庫后,接下來正式開始連接數據庫吧,雖然神秘卻不難哦!
#首先導入PyMySQL庫
import pymysql
#連接數據庫,創建連接對象connection
#連接對象作用是:連接數據庫、發送數據庫信息、處理回滾操作(查詢中斷時,數據庫回到最初狀態)、創建新的光標對象
connection = pymysql.connect(host = 'localhost' #host屬性
user = 'root' #用戶名
password = '******' #此處填登錄數據庫的密碼
db = 'mysql' #數據庫名
)
執行這段代碼就連接好了!
5、增刪改查操作
首先來查看一下有哪些數據庫:
#創建光標對象,一個連接可以有很多光標,一個光標跟蹤一種數據狀態。
#光標對象作用是:、創建、刪除、寫入、查詢等等
cur = connection.cursor()
#查看有哪些數據庫,通過cur.fetchall()獲取查詢所有結果
print(cur.fetchall())
打印出所有數據庫:
(('information_schema',),
('law',),
('mysql',),
('performance_schema',),
('test',))
在test數據庫里創建表:
#使用數據庫test
cur.execute('USE test')
#在test數據庫里創建表student,有name列和age列
cur.execute('CREATE TABLE student(name VARCHAR(20),age TINYINT(3))')
向數據表student中插入一條數據:
sql = 'INSERT INTO student (name,age) VALUES (%s,%s)'
cur.execute(sql,('XiaoMing',23))
查看數據表student內容:
cur.execute('SELECT * FROM student')
print(cur.fetchone())
打印輸出為:('XiaoMing', 23)
Bingo!是我們剛剛插入的一條數據
最后,要記得關閉光標和連接:
#關閉連接對象,否則會導致連接泄漏,消耗數據庫資源
connection.close()
#關閉光標
cur.close()
OK了,整個流程大致如此。
當然這里都是很基礎的操作,更多的使用方法需要在PyMySQL官方文檔里去尋找。
三、導入大數據文件
以csv文件為例,csv文件導入數據庫一般有兩種方法:
1、通過SQL的insert方法一條一條導入,適合數據量小的CSV文件,這里不做贅述。
2、通過load data方法導入,速度快,適合大數據文件,也是本文的重點。
樣本CSV文件如下:

總體工作分為3步:
1、用python連接mysql數據庫;
2、基於CSV文件表格字段創建表;
3、使用load data方法導入CSV文件內容。
sql的load data語法簡介:
LOAD DATA LOCAL INFILE 'csv_file_path' INTO TABLE table_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES
csv_file_path指文件絕對路徑
table_name指表名稱
FIELDS TERMINATED BY ','指以逗號分隔
LINES TERMINATED BY '\\r\\n'指換行
IGNORE 1 LINES指跳過第一行,因為第一行是表的字段名
下面給出全部代碼:
#導入pymysql方法
import pymysql
#連接數據庫
config = {'host':'',
'port':3306,
'user':'username',
'passwd':'password',
'charset':'utf8mb4',
'local_infile':1
}
conn = pymysql.connect(**config)
cur = conn.cursor()
#load_csv函數,參數分別為csv文件路徑,表名稱,數據庫名稱
def load_csv(csv_file_path,table_name,database='evdata'):
#打開csv文件
file = open(csv_file_path, 'r',encoding='utf-8')
#讀取csv文件第一行字段名,創建表
reader = file.readline()
b = reader.split(',')
colum = ''
for a in b:
colum = colum + a + ' varchar(255),'
colum = colum[:-1]
#編寫sql,create_sql負責創建表,data_sql負責導入數據
create_sql = 'create table if not exists ' + table_name + ' ' + '(' + colum + ')' + ' DEFAULT CHARSET=utf8'
data_sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES" % (csv_filename,table_name)
#使用數據庫
cur.execute('use %s' % database)
#設置編碼格式
cur.execute('SET NAMES utf8;')
cur.execute('SET character_set_connection=utf8;')
#執行create_sql,創建表
cur.execute(create_sql)
#執行data_sql,導入數據
cur.execute(data_sql)
conn.commit()
#關閉連接
conn.close()
cur.close()

