溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python數(shù)據(jù)庫操作之PyMysql怎么使用

發(fā)布時(shí)間:2023-03-02 11:37:30 來源:億速云 閱讀:80 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“python數(shù)據(jù)庫操作之PyMysql怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“python數(shù)據(jù)庫操作之PyMysql怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

    PyMysql使用詳解

    在編寫小腳本時(shí),PyMysql是快速連接并操作數(shù)據(jù)庫的一個(gè)不錯(cuò)選擇。

    安裝

    pip3 install PyMysql
    # 可使用 pip list 查看此環(huán)境安裝了哪些第三方庫    pip list | grep PyMysql

    使用

    import pymysql
    連接數(shù)據(jù)庫

    使用connect函數(shù)創(chuàng)建連接對象,此連接對象提供關(guān)閉數(shù)據(jù)庫、事務(wù)回滾等操作

    一般傳參為:host, user, password, port(默認(rèn)為3306), database(想要連接的數(shù)據(jù)庫名)

    db = pymysql.connect(host='127.0.0.1',
                         user='root',
                         password='pwd',
                         database='database_name')

    連接對象的常見方法

    方法名說明
    cursor()獲取游標(biāo)對象,操作數(shù)據(jù)庫,如執(zhí)行DML操作,調(diào)用存儲(chǔ)過程等
    commit()提交事務(wù)
    rollback()回滾事務(wù)
    close()關(guān)閉數(shù)據(jù)庫連接
    操作數(shù)據(jù)庫

    操作數(shù)據(jù)庫主要使用cursor游標(biāo)對象,對數(shù)據(jù)庫進(jìn)行操作

    cursor游標(biāo)對象的常見方法

    方法名說明
    close()關(guān)閉當(dāng)前游標(biāo)對象
    execute(query)執(zhí)行數(shù)據(jù)庫操作,如sql語句或數(shù)據(jù)庫命令
    executemany(query,params)用于批量操作,如:批量更新
    fetchone()獲取查詢結(jié)果集中的下一條記錄
    fetchmany(size)獲取查詢結(jié)果集中指定數(shù)量的記錄,size默認(rèn)為1
    fetchall()獲取查詢結(jié)果集中所有記錄
    nextset()跳至下一個(gè)可用的結(jié)果集

    fetchone(),fetchmany(size),fetchall() 三者的返回值都是元組 或 元組的嵌套 查

    查詢主要獲取結(jié)果集,注意fetchone 得到的是元組, fetchmany(size),fetchall()得到的是元組的嵌套

    注意:

    如果既要使用python的字符串解析%,sql語句中又包含sql的模糊查詢占位符%, 模糊查詢使用%%即可,這樣不會(huì)報(bào)錯(cuò)

    import pymysql
    
    # 創(chuàng)建數(shù)據(jù)庫連接對象
    db = pymysql.connect(host='127.0.0.1',
                         user='root',
                         password='pwd',
                         database='database_name')
    # 創(chuàng)建游標(biāo)對象
    cursor = db.cursor()
    
    table_name = 'map_point'
    sql = "SELECT * FROM %s WHERE username LIKE 'DL%%' " % table_name
    try:
        cursor.execute(sql)  # 執(zhí)行sql語句,也可執(zhí)行數(shù)據(jù)庫命令,如:show tables
        result = cursor.fetchall()  # 所有結(jié)果
        print(result)
    except Exception as e:
        db.rollback()
        print("查詢失敗")
        print(e)
    finally:
        cursor.close()  # 關(guān)閉當(dāng)前游標(biāo)
        db.close()  # 關(guān)閉數(shù)據(jù)庫連接

    循環(huán)查詢:

    在一些場景中,需要進(jìn)行循環(huán)查詢,判斷,此時(shí)在執(zhí)行完execute查詢語句后,務(wù)必進(jìn)行commit提交,否則每次查詢到的數(shù)據(jù)都是之前查詢結(jié)果的快照,也就是舊數(shù)據(jù)。

    或者采用第二種方案,創(chuàng)建connect連接時(shí),增添autocommit=True屬性,自動(dòng)進(jìn)行commit提交。

    增,刪,改

    增刪改需要有提交事務(wù)的操作,查不需要提交事務(wù),但如果循環(huán)查詢,務(wù)必提交事務(wù),否則結(jié)果都是重復(fù)的

    創(chuàng)建連接對象——db= pymysql()

    創(chuàng)建cursor游標(biāo)對象——cur = db.cursor()

    數(shù)據(jù)操作——cur.execute(sql)

    提交連接事務(wù)——db.commit()

    關(guān)閉cursor游標(biāo)對象——cur.close()

    關(guān)閉連接對象——db.close( )

    import pymysql
    
    # 創(chuàng)建數(shù)據(jù)庫連接對象
    db = pymysql.connect(host='127.0.0.1',
                         user='root',
                         password='pwd',
                         database='database_name')
    # 創(chuàng)建游標(biāo)對象
    cursor = db.cursor()
    
    table_name = 'table_name '
    user_id = 'yyy'
    user_no = 'xxx'
    sql = "UPDATE %s SET user_no = '%s' WHERE user_id = '%s'" % (table_name, user_no, user_id)
    try:
        cursor.execute(sql)  # 執(zhí)行sql語句,也可執(zhí)行數(shù)據(jù)庫命令,如:show tables
        db.commit()  # 增刪改,必須執(zhí)行事務(wù)
        print("數(shù)據(jù)更新成功")
    except Exception as e:
        db.rollback()  # 若出現(xiàn)失敗,進(jìn)行回滾
        print("數(shù)據(jù)更新失敗")
        print(e)
    finally:
        cursor.close()  # 關(guān)閉當(dāng)前游標(biāo)
        db.close()  # 關(guān)閉數(shù)據(jù)庫連接

    使用循環(huán)批量更新

    db = pymysql.connect(host='127.0.0.1',
                         user='root',
                         password='pwd',
                         database='database_name')
    
    table_name = 'table_name'
    update_list = ['xxx2', 'xxxx3']
    condition_list = ['xxx', 'xxx1']
    # 條件集合,更新集合長度相等時(shí)可使用,可根據(jù)其他情況重新編寫
    cursor = db.cursor()
    for i in range(len(condition_list)):
        sql = "UPDATE %s SET user_no = '%s' WHERE user_id = '%s'" % (table_name, update_list[i], 
                                                                                    condition_list[i])
        print('執(zhí)行sql語句:' + sql)
        try:
            cursor.execute(sql)
            db.commit()
            print("數(shù)據(jù)更新成功" + str(i+1) + '條')
        except Exception as e:
            db.rollback()
            print("數(shù)據(jù)更新失敗")
            print(e)
    cursor.close()
    db.close()

    使用executemany(query, param) 批量更新

    params為每條記錄的維度,可為嵌套數(shù)組和元組

    注意:sql語句中需要更改的數(shù)據(jù)不管什么類型,統(tǒng)一使用%s作為占位符,不需要加引號

    # 創(chuàng)建數(shù)據(jù)庫連接對象
    db = pymysql.connect(host='127.0.0.1',
                         user='root',
                         password='pwd',
                         database='database_name')
    # 創(chuàng)建游標(biāo)對象
    cursor = db.cursor()
    update_list = ['a', 'b']
    condition_list = ['a1', 'b1']
    # 條件數(shù)組和需要更新的數(shù)據(jù)數(shù)組是分開的,因?yàn)閜aram需要以每條的維度,所以可以使用拉鏈函數(shù)合并
    params = zip(update_list, condition_list) # 或 param = [['a', 'a1'], ['b', 'b1']]
    sql = "UPDATE map_point SET storageLocation_no = %s WHERE position_id = %s"  # 注意 這里的 占位%s 都不用加引號
    try:
        cursor.executemany(sql, params)  # 執(zhí)行sql語句
        db.commit()  # 執(zhí)行事務(wù)
        print("數(shù)據(jù)批量更新成功")
    except Exception as e:
        db.rollback()
        print("數(shù)據(jù)更新失敗")
        print(e)
    finally:
        cursor.close()  # 關(guān)閉當(dāng)前游標(biāo)
        db.close()  # 關(guān)閉數(shù)據(jù)庫連接

    讀到這里,這篇“python數(shù)據(jù)庫操作之PyMysql怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI