pymysql鏈接和操做Mysql數據庫

pymysql

1、概要

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

2、PyMySQL 安裝

pip install pymysqlmysql

3、操做流程

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

4、核心類介紹

一、建立connection

  1. 說明sql

  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. 返回值markdown

    cursor網絡

  5. 示例代碼app

    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. 其它方法socket

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

    • 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)

二、獲取cursor對象

  1. 說明

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

  2. 核心方法

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

    一、執行查詢功能

    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) 移動遊標位置。

5、基本操做

查詢數據

  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()
相關文章
相關標籤/搜索