1. 程式人生 > >Python的學習筆記DAY12---python和Mysql之二

Python的學習筆記DAY12---python和Mysql之二

        今天來看insert,update和delete的操作。它們三個的操作和select的在大體上是相同的,不過這三條命令對資料庫的資料進行了修改,所以在某些時候可能會發生異常,所以在使用corsor.execute(sql)後如無異常則使用conn.commit()提交事務,如有異常則使用conn.rollback()回滾事務。所謂事務,就是訪問和更新資料庫的一個程式執行單元它具有四個特性:

        1.原子性:事務中包含的諸操作,要麼都做,要麼都不做

        2.一致性:事務必須使資料庫從一致性狀態變到另一個一致性狀態

        3.隔離性:一件事務執行不被其他事務干擾

        4.永續性:事務一旦提交,其對資料庫的改變是永久的

故在開發中要關閉自動commit,設定conn.aotucommit(False),正常結束事務conn.commit(),異常結束事務conn.rollback()。

        有如下圖結構資料表user:


使用如下程式碼:

# -*- coding:utf-8 -*-  
import pymysql
pymysql.install_as_MySQLdb()
import MySQLdb

conn = MySQLdb.connect(host = '127.0.0.1',
                       port = 3306,
                       user = 'root',
                       passwd = '123456',
                       db = 'pytest',
                       charset = 'utf8' 
                       )

cursor = conn.cursor()

sql_insert = "insert into user(user,name,age) values('ten','十',10)"
sql_update = "update user set name = '9' where user = 'nine'"
sql_delete = "delete from user1 where age < 3"
    
cursor.execute(sql_insert)
print(cursor.rowcount)
cursor.execute(sql_update)
print(cursor.rowcount)
cursor.execute(sql_delete)
print(cursor.rowcount)
conn.commit()

cursor.close()
conn.close()
執行後輸出:

1

1

2

此時資料表變成了:


操作執行成功。

        需要注意的是第一行必須加上下面的程式碼,不然的話漢字的插入會出現亂碼現象。

# -*- coding:utf-8 -*-  
        上面的程式碼表示了insert,update和delete的用法,在實際操作中,會將SQL語句和其執行語句放到try中,誒下圖程式碼所示,我們, 將sql_delete的SQL語句中的user改為user1來製造個異常看他如何處理。

        首先將資料庫恢復到上面的資料。然後執行如下程式碼:

# -*- coding:utf-8 -*-  
import pymysql
pymysql.install_as_MySQLdb()
import MySQLdb

conn = MySQLdb.connect(host = '127.0.0.1',
                       port = 3306,
                       user = 'root',
                       passwd = '123456',
                       db = 'pytest',
                       charset = 'utf8' 
                       )

cursor = conn.cursor()

try:
    sql_insert = "insert into user(user,name,age) values('ten','十',10)"
    sql_update = "update user set name = '9' where user = 'nine'"
    sql_delete = "delete from user1 where age < 3"
    
    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:
    print(e)
    conn.rollback()


cursor.close()
conn.close()
執行結果如圖:


沒有找見user1這個表,然後檢視資料庫,並未改變,表明在執行出錯之後執行了conn.rollback(),回滾了事務,並沒有對資料庫進行修改。