python庫:pymysql
安裝:install pymysql、mysql數據庫
一、連接數據庫、創建speder庫、查詢版本、
import pymysql ##鏈接數據庫 db = pymysql.connect(host='localhost',user='root', password='123456', port=3306) ##用 cursor() 方法獲得 MySQL 的操作游標,利用游標來執行 SQL 語句 cursor = db.cursor() ##查詢數據庫版本語句 cursor.execute('SELECT VERSION()') ##調用fetchone() 方法來獲得第一條數據,也就得到了版本號 data = cursor.fetchone() print('Database version:', data) ##執行了創建數據庫的操作,數據庫名稱叫做 spiders,默認編碼為 utf-8 #cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8") db.close()
二、創建表
import pymysql
##創建表 ''' 字段名 含義 類型 id 學號 varchar name 姓名 varchar age 年齡 int ''' 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()
三、插入數據
#簡單插入數據 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 students(id, name, age) values(%s, %s, %s)' #升級1.0插入數據,啟用防錯 try: cursor.execute(sql, (id, user, age)) ''' 執行 db 對象的 commit() 方法才可實現數據插入, 這個方法才是真正將語句提交到數據庫執行的方法, 對於數據插入、更新、刪除操作都需要調用該方法才能生效 ''' db.commit() except: #如果出錯了就把所有數據回滾(即撤消),就像沒操作之前一樣 db.rollback() db.close()
3.1、【插入數據2.0升級版,用字典插入數據,不用修改sql語句,只要修改字典即可】
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 語句然后執行 sql = 'UPDATE students SET age = %s WHERE name = %s' try: cursor.execute(sql, (25, 'Bob')) db.commit() except: db.rollback() db.close() #【升級版更新數據用字典傳入,不需改sql語句】 data = { 'id': '20120001', 'name': 'Bob', 'age': 21 } table = 'students' keys = ', '.join(data.keys()) values = ', '.join(['%s'] * len(data)) #實際用的是插入語句,不過加了ON DUPLICATE KEY UPDATE(主鍵存在,則執行更新操作) sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.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 構造出來是這樣的: INSERT INTO students(id, name, age) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE id = %s, name = %s, age = %s 相比上面介紹的插入操作的 SQL,后面多了一部分內容,那就是更新的字段,ON DUPLICATE KEY UPDATE 使得主鍵已存在的數據進行更新,
后面跟的是更新的字段內容。所以這里就變成了 6 個 %s。所以在后面的 execute() 方法的第二個參數元組就需要乘以 2 變成原來的 2 倍。 如此一來,我們就可以實現主鍵不存在便插入數據,存在則更新數據的功能了 '''
五、刪除數據
#刪除 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() ''' 這里我們指定了表的名稱,刪除條件。因為刪除條件可能會有多種多樣,運算符比如有大於、小於、等於、LIKE等等,
條件連接符比如有 AND、OR 等等,所以不再繼續構造復雜的判斷條件,在這里直接將條件當作字符串來傳遞,以實現刪除操作 '''
六、查詢數據
#【查詢數據,升級操作,防止內存開銷過大】 sql = 'SELECT * FROM students WHERE age >= 20' try: cursor.execute(sql) print('Count:', cursor.rowcount) row = cursor.fetchone() while row: print('Row:', row) row = cursor.fetchone() except: print('Error') ''' 不用fetchall,而用fetchone這樣每循環一次, 指針就會偏移一條數據,隨用隨取,簡單高效 ''' #查詢數據,簡單操作會比較費內存 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) '''