pymysql連接和操作Mysql數據庫

pymysql

一、概要

PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,

二、PyMySQL 安裝

pip install pymysql

三、操作流程

  1. 創建connection
  2. 獲取cursor
  3. 執行增刪改查的操作
  4. 處理數據
  5. 關閉cursor
  6. 關閉connection

四、核心類介紹

1、創建connection

  1. 說明

  2. 語法格式

    conn = pymysql.connect(host=None, user=None, password="",
                     database=None, port=0, db=None,charset='')
    
  3. 常用參數說明

    參數名 類型 說明
    host String MySQL的服務器地址
    port int MySQL的端口號
    user String 用戶名
    passwd String 密碼
    db String 使用的數據庫
    charset String 連接字符集
  4. 返回值

    cursor

  5. 示例代碼

    HOST = '127.0.0.1'
    PORT = 3306
    USER = 'root'
    PASSWD = 'root'
    DB = 'python'
    CHARSET = 'utf8'
    
    connection = pymysql.connect(host=HOST,
                                 port=PORT,
                                 user=USER,
                                 passwd=PASSWD,
                                 db=DB,
                                 charset=CHARSET)
    
    
  6. 其它方法

    方法 描述
    begin() 開啓事務
    commit() 提交事務
    cursor(cursor=None) 創建一個遊標用來執行語句
    ping(reconnect=True) 檢查連接是否存活,會重新發起連接
    rollback() 回滾事務
    close() 關閉連接
    select_db(db) 選擇數據庫
    show_warnings() 查看warning信息
  7. 詳細

    • host – 數據庫服務器所在的主機。
    • user – 登錄用戶名。
    • password – 登錄用戶密碼。
    • database – 連接的數據庫。
    • port – 數據庫開放的端口。(默認: 3306)
    • bind_address – 當客戶端有多個網絡接口時,請指定連接到主機的接口,參數可以是主機名或IP地址。
    • unix_socket – 使用unix套接字而不是tcp/ip。
    • charset – 連接字符集。
    • sql_mode – 默認SQL模式。
    • read_default_file – 指定my.cnf文件路徑,以便從[client]部分讀取參數。
    • conv – 要使用的轉換字典,而不是默認值。
    • use_unicode – 是否默認爲unicode字符串,對於Py3k,此選項默認爲true。
    • client_flag – 發送到MySQL的自定義標誌。
    • cursorclass – 使用自定義的遊標類。
    • init_command – 建立連接時要運行的初始SQL語句。
    • connect_timeout – 建立連接超時時間。(默認: 10,最小: 1,最大: 31536000)
    • read_default_group – 從配置文件中讀取組。
    • compress – 不支持
    • named_pipe – 不支持
    • autocommit – 設置自動提交模式,不設置意味着使用數據庫默認。(默認值: False)
    • local_infile – 是否啓用“LOAD LOCAL INFILE”命令的使用。(默認值: False)
    • max_allowed_packet – 發送到服務器的數據包的最大大小 (以字節爲單位,默認值: 16MB),僅用於限制小於默認值 (16KB) 的 “LOAD LOCAL INFILE” 數據包的大小。
    • defer_connect – 不要顯式連接建設,等待連接調用。(默認值: False)
    • db – 連接數據庫別名(兼容MySQLdb)
    • passwd – 密碼輸入別名(兼容MySQLdb)
    • binary_prefix – 在bytes和bytearray上添加_binary前綴(默認: False)

2、獲取cursor對象

  1. 說明

    遊標對象,用於執行查詢和獲取結果

  2. 核心方法

    方法名 說明
    execute() 用於執行一個數據庫的查詢命令
    fetchone() 獲取結果集中的下一行
    fetchmany(size) 獲取結果集中的下(size)行
    fetchall() 獲取結果集中剩下的所有行
    rowcount 最近一次execute返回數據/影響的行數
    close() 關閉遊標
  3. 舉個栗子

    1、執行查詢功能

    with connection.cursor() as cursor:
        sql = 'select * from home_user'
        cursor.execute(sql)
        results = cursor.fetchall()
        connection.commit()
        for results in results:
            uid = results[0]
            name = results[1]
            password = results[2]
            print('==========用戶信息===============')
            print('用戶id: {id} \n用戶名: {name}\n密碼: {pwd}'.format(id=uid, name=name, pwd=password))
    
  4. 詳細

    方法 描述
    close() 關閉遊標。
    execute(query, args=None) 執行單條語句,傳入需要執行的語句,是string類型;同時可以給查詢傳入參數,參數可以是tuple、list或dict。執行完成後,會返回執行語句的影響行數,如果有的話。
    executemany(query, args) 執行多條INSERT語句,傳入需要執行的語句;同時可以給查詢傳入參數,參數是一個mappings序列。執行完成後,會返回執行語句的影響行數,如果有的話。
    fetchone() 獲取下一行數據。
    fetchall() 獲取所有數據。
    fetchmany(size=None) 獲取幾行數據。
    read_next() 獲取下一行數據。
    callproc() 用來調用存儲過程。
    mogrify() 參數化查詢,防止SQL注入。
    scroll(num,mode) 移動遊標位置。

五、基本操作

查詢數據

  1. 分頁查詢操作

    def find_by_page(page, size):
        with pymysql.connect(host=HOST,
                             port=PORT,
                             user=USER,
                             passwd=PASSWORD,
                             charset=CHARSET,
                             db=DB_NAME) as cursor:
            sql = "SELECT * FROM t_addr LIMIT{},{}".format((page - 1) * size, size)
            cursor.execute(sql)
            user = cursor.fetchall()
    

事務操作

  1. 示例代碼

    conn = pymysql.connect(
        host='10.10.0.109',
        port=3306,
        user='mha',
        password='123456',
        database='sbtest',
        charset='utf8'
    )
    
    cursor = conn.cursor()
    
    # 插入sql;
    sql_insert = "insert into t_user (userid,username) values (10,'user10')"
    # 更新sql;
    sql_update = "update t_user set username = 'name91' where userid=9"
    # 刪除sql;
    sql_delete = "delete from t_user where userid < 3"
    
    # 把一個事務放到一個try塊裏,如果出現異常就回滾;
    try:
        # 開啓事務;
        conn.begin()
    
        cursor.execute(sql_insert)
        print(cursor.rowcount)
    
        cursor.execute(sql_update)
        print(cursor.rowcount)
    
        cursor.execute(sql_delete)
        print(cursor.rowcount)
    
        # 提交事務;
        conn.commit()
    
    except Exception as e:
        # 若有異常就回滾;
        conn.rollback()
    
    cursor.close()
    conn.close()
    

批量插入

  1. 示例代碼

    # 測試事務 批量添加
    def test_batch_insert():
        conn = pymysql.connect(host=HOST,
                               port=PORT,
                               user=USER,
                               passwd=PASSWORD,
                               charset=CHARSET,
                               db=DB_NAME)
        cursor = conn.cursor()
        try:
            sql = 'INSERT INTO t_addr(PROVICE, CITY, COUNTY, DEATIL, USERID) VALUES (%s,%s,%s,%s,%s)'
            li = []
            for i in range(50):
                li.append(('湖北省', '武漢市', '高新區' + str(i), '智慧園2135', 6))
            # 開啓事物
            conn.begin()
            cursor.executemany(sql, li)
            # 提交
            conn.commit()
        except Exception as e:
            conn.rollback()
            print(e)
            # 報錯事務回滾
        finally:
            # 關閉連接
            cursor.close()
            conn.close()
    

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