Python操作mysql數據庫

數據庫API定義了一組用於連接數據庫服務器,執行SQL查詢並獲得結果的高級函數和對象。其中兩個主要的對象:一個是用於管理數據庫連接的Connection對象,另一個是用於執行查詢的Cursor對象
模塊函數connect的使用:

    c = MySQLdb.connect(
        host="數據庫ip",
        db="數據庫名稱",
        port=3306, #默認是3306端口
        user="登陸數據庫用戶名",
        password="登陸數據庫密碼",
        charset="utf8"    #指定字符集
    )

連接成功則返回Connection對象,Connection對象的實例化方法有:

c.close() 關閉與數據庫服務器的連接
c.commit() 將所有未完成的事務提交到數據庫中,如果需要進行增刪改,都需要調用此方法
c.rollback() 將數據庫回滾到未完成事務的開始狀態,如果在更新數據庫的過程中代碼發生異常,可以用此方法撤銷對數據庫做出的修改
c.cursor() 創建一個使用連接的新的cursor對象,可以使用它來執行SQL語句並獲得結果

調用c.cursor()方法可以創建Cursor對象,例cur = c.cursor(),cur的實例有:

cur.close() 關閉遊標,防止再對其使用
cur.execute(query [,parameters]) 在數據庫上執行查詢,query是一條sql執行語句的字符串parameters是一個序列或映射,用於查詢字符串中的變量賦值
cur.executemary(query [,parametersequence]) 重複執行或查詢sql命令
cur.fetchone() 返回由execute()和executemary()生成的下一行結果集,生成的結果一般是元組或列表
cur.fetchmary([size]) size爲查詢要顯示的數量
cur.fetchall() 返回全部的行數
cur.description 提供當前的每一行信息的元組序列
cur.rowrount 由cur.execute()結果後生成的結果行數,如果設置爲-1,則表示沒有結果

數據庫連接以及查詢數據練習

import MySQLdb


class MysqlSearch(object):
    def __init__(self):
        self.get_conn()


    def get_conn(self):
        try:
            self.conn = MySQLdb.connect(
                host='127.0.0.1',
                port=3306,
                db='sql_718',
                user='root',
                password='123456',
                charset='utf8'
            )
        except MySQLdb.Error as e:
            print("Error:" %e)

    def close_conn(self):
        try:
            if self.get_conn():
                self.conn.close()
        except MySQLdb.Error as e:
            print('ERROR:%s' % e)

    def get_one(self):                               #處理單行數據
        sql = 'SELECT * FROM `news`'                    #準備sql語句
        cursor = self.conn.cursor()                     #找到cursor遊標
        cursor.execute(sql)                             #執行sql語句
        # 拿到查詢的結果,fetchone()只能拿到一條數據,如果要查詢多條數據,可以用使用fetchmany()
        rest = cursor.fetchone()                    #處理單行數據
        #print(rest)
        #處理數據
        # k_list = [k[0] for k in cursor.description]
        # print(k_list)
        # zip_obj = zip(k_list, rest)
        # print(zip_obj)
        # rest_dict = dict(zip_obj)
        # print(rest_dict)
        rest_dict = dict(zip([k[0] for k in cursor.description], rest)) #返回字典形式,以便在mian()函數中使用鍵值對的方式查詢值
        cursor.close()
        self.conn.close()
        return rest_dict
        
    def get_more(self):            #處理多行數據
        sql = 'SELECT * FROM `news`'                    #準備sql語句
        cursor = self.conn.cursor()                     #找到cursor遊標
        cursor.execute(sql)                             #執行sql語句
        rest2 = cursor.fetchall()
        rest_dict_more = [dict(zip([k[0] for k in cursor.description], row)) for row in rest2]
        cursor.close()
        self.conn.close()
        return rest_dict_more

#添加數據
    def add_data(self):
        try:
            sql = 'INSERT INTO `news` (`title`,`content`, `types`, `image`, `author`, `is_valid`) VALUE (%s, %s, %s, %s, %s, %s);'
            cursor = self.conn.cursor()
            cursor.execute(sql,('王者法師是怎樣煉成的', '前期幫打野看藍看野豬,配合打野入侵野區...', '企鵝號', '/static/img/news/01.png', '小白銀', 1))
            self.conn.commit()
            cursor.close()
        except MySQLdb.Error as e:
            print("Error:" %e)
            self.conn.rollback()
        self.conn.close()
#修改數據
    def update_data(self, word):
        try:
            sql = 'UPDATE `news` SET title = "%s" WHERE id = 1;' %word
            cursor = self.conn.cursor()
            cursor.execute(sql)
            self.conn.commit()
            cursor.close()
        except MySQLdb.Error as e:
            print("Error:" %e)
            self.conn.rollback()           #如果失敗則回滾
        self.conn.close()

def main():
    obj = MysqlSearch()
    rest = obj.get_one()
    print("查詢一條數據")
    print(rest['title'])
    print("分割線----------------------------")
    
def main_more():
    obj = MysqlSearch()
    rest2 = obj.get_more()
    print("查詢多條數據")
    for item in rest2:
        print(item['title'])
        
 def main_add():
    obj = MysqlSearch()
    obj.add_data()
    
def main_update():
    obj = MysqlSearch()
    obj.update_data("掌握王者開團時機")    

if __name__ == '__main__':
    main()
    main_more()
    main_add()
    main_update()

運行結果爲:
在這裏插入圖片描述原先數據庫的表內容:

在這裏插入圖片描述在這裏插入圖片描述
MySQLdb定義了一個高級異常Error,作爲其它錯誤的基類,具體的錯誤處理:

異常 描述
DatabaseError 與數據庫本身相關的錯誤
InterfaceError 與數據庫接口相關的錯誤,但不是數據庫本身
DataError 與處理的數據相關的錯誤,例如,類型轉換錯誤,除零等等
OperationalError 與數據庫本身的運行相關的錯誤,例如丟失連接
IntegrityError 當數據庫的關係完整性被破壞時出現的錯誤
InternalError 數據庫內部的錯誤,例如丟失一個失效的遊標
ProgrammingError SQL查詢中錯誤
NotSupportedError 不受底層數據庫支持的數據庫API方法導致的錯誤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章