如何使用MySQL,這些操作你得明白!

MySQL數據庫是基於關係模型的數據庫,而關係模型是通過二維表來保存的,所以它的儲存方式就是行列組成的表,每一列是一個字段,每一行是一條記錄。今天我們主要介紹Python3下使用PyMySQL操作MySQL數據庫的方法。

1.準備工作

在開始之前,我們需要安裝好PyMySQL庫,安裝方法仍然是我們老生常談的方法,用pip安裝,命令如下:

pip3 install pymysql

執行完命令後即可完成安裝。

2.連接數據庫

假設當前的MySQL運行在本地,用戶名爲root,密碼爲123456,運行端口爲3306。然後用PyMySQL先連接MySQL,創建了一個新的數據庫,命名爲spiders,代碼如下:

importpymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306)cursor=db.cursor()cursor.execute('SELECT VERSION()')data=cursor.fetchone()print('Database version:',data)cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")db.close()

運行結果如下:

Database version: ('5.7.23',)

連接成功後,需要調用cursor()方法獲得MySQL的操作遊標,利用遊標來執行SQL語句。這裏我們執行了兩句SQL,直接用execute()方法即可。第一句SQL用於獲得MySQL的當前版本,然後調用fetchone()方法獲得第一條數據,也就得到了版本號。

第二句SQL執行創建數據庫的操作,數據庫命名爲spiders,默認編碼爲UTF-8。

3.創建表

一般來說,創建數據庫的操作只需執行一次就好。當然,我們也可以手動創建數據庫。以後我們的操作都在spiders數據庫上執行。創建數據庫後,在連接時需要額外指定一個參數db。

例如,我們創建一個數據包students,此時執行創建表的SQL語句即可。這裏指定3個字段(id、name、age),創建該表的示例代碼如下:

import pymysql

db = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')

cursor = db.cursor()

sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL,name VARCHAR(255) NOT NULL,age INT NOT NULL,PRIMARY KEY (id))'

cursor.execute(sql)

db.close()

運行之後,我們便創建了一個名爲students的數據表。

4.插入數據

例如,這裏爬取了一個學生信息,學號爲20120001,名字爲Bob,年齡20,那麼如何將該條數據插入數據庫呢?示例代碼如下:

import pymysql

id = '20120001'

user = 'Bob'

age = 20

db = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')

cursor = db.cursor()

sql = 'INSERT INTO student(id,name,age) values(%s,%s,%s)'

try:

    cursor.execute(sql,(id,user,age))

    db.commit()

except:

    db.rollback()

db.close()

這裏首先構造了一個SQL語句,其Value值沒有用字符串拼接的方式來構造,選擇直接用格式化符%s來實現,有幾個Value寫幾個%s,我們只需在execute()方法的第一個參數傳入SQL語句,Value值用統一的元組傳過來就好了。

之後值得注意的是,需要執行db對象的commit()方法纔可實現數據插入,這個方法纔是真正將語句提交到數據庫執行的方法。對於數據插入、更新、刪除操作,都需要調用該方法才能生效。

接下來,我們加一層異常處理,如果執行失敗,則調用rollback()執行數據回滾,相當於什麼都沒發生過。

上面數據插入的操作是通過構造SQL語句實現的,但有一個極其不方便的地方,比如突然增加了性別字段gender,此時SQL語句就需要改成:

INSERT INTO students(id,name,age,gender) values(%s,%s,%s,%s)

相應的元組參數則需要改成:

(id,name,age,gender)

這顯然不是我們需要的。在很多情況下,我們要達到的效果就是插入方法無需改動,做成一個通用方法,只需要傳入一個動態變化的字典就好了。

然後SQL語句會根據字典動態構造,元組也動態構造,這樣才能實現通用的插入方法。所以,這裏我們需要改寫一下插入方法:

import pymysql

db = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')

cursor = db.cursor()

data ={

    'id':'20120001',

    'name':'Bob',

    'age':20

}

table = 'Students'

keys = ', '.join(data.keys())

values = ', '.join(['%s']*len(data))

sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table,keys=keys,values=values)

try:

    if cursor.execute(sql,tuple(data.values())):

        print('Successful')

        db.commit()

except:

    print('Failed')

    db.rollback()

db.close()

如此以來,我們便實現了傳入一個字典來插入數據的方法,不需要再去修改SQL語句和插入操作了。

5.更新數據

數據更新操作實際上也是執行SQL語句,最簡單的方式就是構造一個SQL語句,然後執行:

sql = 'UPDATE students SET age =%s WHERE name = %s'

try:

    cursor.execute(sql,(25,'Bob'))

    db.commit()

except:

    db.rollback()

db.close()

在實際的數據抓取過程中,大部分情況下需要插入數據,但我們關心的是會不會出現重複數據,如果出現了,我們希望更新數據而不是重複保存一次。因此,這裏可以再實現一種去重的方法,如果數據存在,則更新數據;如果數據不存在,則插入數據。示例如下:

import pymysql

db = pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')

cursor = db.cursor()

data ={

    'id':'20120001',

    'name':'Bob',

    'age':20

}

table = 'Students'

keys = ', '.join(data.keys())

values = ', '.join(['%s']*len(data))

sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table,keys=keys,values=values)

update = ', '.join(["{key} = %s".format(key=key) for key in data])

sql += update

try:

    if cursor.execute(sql,tuple(data.values())*2):

        print('Successful')

        db.commit()

except:

    print('Failed')

    db.rollback()

db.close()

這裏構造的SQL語句其實是插入語句,但我們在後面加了ON DUPLICATE KEYUPDATE。這行代碼的意思是如果主鍵已經存在,就執行更新操作。

比如,我們傳入的數據id仍然爲20120001,但是年齡有所變化,由20變成了21,此時這條數據不會被插入,而是直接更新id爲20120001的數據。

6.刪除數據

刪除操作先對簡單,直接使用DELETE語句即可,只是需要指定要刪除的目標表名和刪除條件,而且仍然需要使用db的commit()方法才能生效。示例如下:

table = 'students'

condition = 'age > 20'

sql = 'DELETE FROM {table} WHERE {condition}'.format(table=table,condition=condition)

try:

    cursor.execute(sql)

    db.commit()

except:

    db.rollback()


db.close()

7.查詢數據

查詢會用到SELECT語句,示例如下:

sql = 'SELECT * FROM students WHERE age >=20'

try:

    cursor.execute(sql)

    print('Count:',cursor.rowcount)

    one = cursor.fetchone()

    print('One:',one)

    results = cursor.fetchall()

    print('Results:',results)

    print('Results Type:',type(results))

    for row in results:

        print(row)

except:

    print('Error')

運行結果如下:

Count:4

One:('20120001','Bob',25)

Results:(('20120011','Mary',21),('20120012','Mike',20),('20120013','James',22)

Results Type:<class 'tuple'>

('20120011','Mary',21)

('20120012','Mike',20)

('20120013','James',22)

這裏我們構造了一條SQL語句,將年齡20歲及以上的學生查詢出來,然後將其給excute()方法。注意,這裏不需要db的commit()方法。接着,調用cursor的rowcount屬性獲取查詢結果的條數,當前示例中是4條。

但是這裏需要注意一個問題,這裏顯示的是3條數據而不是4條,fetchall()方法不是獲取所有數據嗎?這個問題留給大家思考,下一篇公佈答案。

總結

今天我們介紹瞭如何使用PyMySQL操作MySQL數據庫的方法,主要包括:插入、更新、刪除、查詢數據,後面我會給大家找一些經典的實戰案例,讓大家在實戰中熟悉運用這些操作來儲存數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章