數據庫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方法導致的錯誤 |