一、環境
Windows 7 x64 python 3.7.1 pymysql 0.9.3 mysql5.6.43
二、pymysql的簡單使用
1、准備數據庫demo_temp
create database demo_temp;
2、連接數據庫
import pymysql.cursors connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor )
3、創建表
import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) # 創建表users with connect.cursor() as cursor: sql = """ CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT , user CHAR(30), passwd CHAR(20)) """ cursor.execute(sql) connect.close()
4、一個簡單的增、刪、改、查實例
import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) with connect.cursor() as cursor: # 創建游標 # 創建表 sql = """ CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT , user CHAR(30), passwd CHAR(20)) """ cursor.execute(sql)
# 向表中插入數據 sql = """ INSERT INTO users (user,passwd) VALUES ('小明','123') """ cursor.execute(sql) connect.commit() # 插入數據后必須更新
# 查詢數據 sql = """ select * from users """ cursor.execute(sql) ret = cursor.fetchone() # 提取查詢數據 print(ret)
# 修改數據 sql = """ update users set user='葫蘆娃' where id=1 """ cursor.execute(sql) # 再次查詢數據 sql = """ select * from users """ cursor.execute(sql) ret = cursor.fetchone() # 提取查詢數據 print(ret) connect.close() # 關閉數據庫連接 # 打印內容如下 {'id': 1, 'user': '小明', 'passwd': '123'} {'id': 1, 'user': '葫蘆娃', 'passwd': '123'}
5、簡單的事務
import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) try: with connect.cursor() as cursor: # 創建游標 # 插入數據 sql = """ INSERT INTO users (user,passwd) VALUES ('11111','123') """ cursor.execute(sql) # 更新數據 sql_1 = """ update users set user='葫蘆娃' where id=1 """ cursor.execute(sql_1) raise NameError # 更新數據時主動拋出異常 except Exception as e: connect.rollback() # 事務回滾 connect.commit() connect.close() # 關閉數據庫連接
通過下面的小動畫我們可以看出,這里模擬在更新數據時出現問題。而插入數據時沒有問題的。然后執行事務回滾,最終數據沒有被寫入到數據庫中。
三、Connection中常用API
1、open() :檢測數據庫是否連接。
connect.open:如果數據庫連接返回Trhe,否則返回False。
2、ping(reconnect=True)
connect.ping(reconnect=True):如果reconnect=True表示連接斷開后,重新進行連接。
import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) print(connect.open) # 打印數據庫連接狀態 connect.close() # 關閉數據庫連接 connect.ping(reconnect=True) # 重新連接數據庫 print(connect.open) # 打印數據庫連接狀態
下面的小動畫向我們展示了當connect斷開連接后,使用connect.ping(reconnect=True)又重新連接到了數據庫。
3、rollback
():回滾當前事務,用法在上面,這里就不再演示了。
4、select_db(db):切換數據庫。
# demo_test數據庫中users表數據 mysql> select * from users; +----+-----------+--------+ | id | user | passwd | +----+-----------+--------+ | 1 | 小明 | 123 | | 2 | 小剛 | 123 | | 3 | 小紅 | 123 | | 4 | 葫蘆娃 | 123 | | 5 | 小明 | 123 | +----+-----------+--------+ # demo_temp2庫中test表中數據 mysql> select * from test; +------+------+----------+ | id | user | password | +------+------+----------+ | 1 | abc | 123 | +------+------+----------+ import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) with connect.cursor() as cursor: # 創建游標 # 查詢demo_temp中users表的數據 sql = """ select * from users """ cursor.execute(sql) ret = cursor.fetchall() # 提取查詢數據 print(ret) print('-'*80)
# 切換到demo_temp2數據庫,查詢test表的數據 connect.select_db('demo_temp2') sql = """ select * from test """ cursor.execute(sql) ret = cursor.fetchall() # 提取查詢數據 print(ret) connect.close() # 關閉數據庫連接 # 打印結果 [{'id': 1, 'user': '小明', 'passwd': '123'}, {'id': 2, 'user': '小剛', 'passwd': '123'}, {'id': 3, 'user': '小紅', 'passwd': '123'},
{'id': 4, 'user': '葫蘆娃', 'passwd': '123'}, {'id': 5, 'user': '小明', 'passwd': '123'}] -------------------------------------------------------------------------------- [{'id': 1, 'user': 'abc', 'password': '123'}]
5、cursor():創建游標對象,用於操作數據(增、刪、改、查)。
6、commit():提交請求,當向數據庫中插入數據時,需要使用commit()進行提交,否則數據將不能寫入數據庫。
7、close():關閉數據庫連接。
四、Cursor常用API
1、cursor.execute(query, args=None):執行sql語句。
參數:
- query (str):sql語句.
- args (tuple, list or dict):sql語句中如果有變量,或者格式化輸出,會在這里填充數據。
Returns:返回一個int值,表示sql語句影響到的行數。
下面演示插入數據的四種方式:
import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) with connect.cursor() as cursor: # 創建游標 # 第一種方式向表中插入數據 sql = """ INSERT INTO users (user,passwd) VALUES ('123','123') """ cursor.execute(sql) # 第二種方式向表中插入數據 sql = """ INSERT INTO users (user,passwd) VALUES (%s,%s) """ cursor.execute(sql,['456','456']) # 第三種方式向表中插入數據 sql = """ INSERT INTO users (user,passwd) VALUES (%s,%s) """ cursor.execute(sql, ('789', '789')) # 第四種方式向表中插入數據 sql = """ INSERT INTO users (user,passwd) VALUES (%(a)s,%(b)s) """ cursor.execute(sql, {'a':'abc','b':'123'}) # 這里的'a'和'b'要和上面VALUES中對應 connect.commit() # 插入數據后必須更新 # 查詢數據 sql = """ select * from users """ cursor.execute(sql) ret = cursor.fetchall() # 提取查詢數據 print(ret) connect.close() # 關閉數據庫連接
2、cursor.executemany(query, args):可以執行多條sql語句。
參數:
query :sql語句
args:可迭代對象
Returns:返回sql語句影響到的行數。
下面是方法實例:
import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) with connect.cursor() as cursor: # 創建游標 # 插入多條數據 sql = """ INSERT INTO users (user,passwd) VALUES (%s,%s) """ ret_row = cursor.executemany(sql,[['a','123'],['b','234'],['c','456']]) # 在args中傳入一個可迭代對象。 connect.commit() # 插入數據后必須更新 print(f'當前受影響了{ret_row}行') # 查詢數據 sql = """ select * from users """ cursor.execute(sql) ret = cursor.fetchall() # 提取查詢數據 print(ret) connect.close() # 關閉數據庫連接
3、cursor.fetchone():從查詢語句中獲取一條查詢結果。
4、cursor.fetchall():獲取所有查詢到的結果。
5、cursor.fetchmany(size):根據size獲取相應的行數。
6、cursor.mogrify(query, args=None):返回執行的sql語句,下面是示例:
import pymysql.cursors # 連接數據庫 connect = pymysql.connect( host='127.0.0.1', user='root', password='123', db='demo_temp', charset='utf8', cursorclass=pymysql.cursors.DictCursor ) with connect.cursor() as cursor: # 創建游標 sql = """ select * from users """ cursor.execute(sql) ret_sql = cursor.mogrify(sql) # 返回執行的sql語句 cursor.fetchmany(2) # 提取查詢數據 print(ret_sql) connect.close() # 關閉數據庫連接
7、cursor.close():關閉游標,關閉游標后,游標內所有數據將被清空。
參考文檔:https://pymysql.readthedocs.io/en/latest/