Python數據庫操作
對於關系型數據庫的訪問,Python社區已經指定了一個標准,稱為Python Database API SepcificationV2.0.MySQL、Qracle等特定數據庫模塊遵從這一規范,而且可添加更多特性,
高級數據庫API定義了一組用於連接數據庫服務器、執行SQL語句並獲得結果的函數和對象,其中有兩個主要的對象:一個是用於管理數據庫連接的Connection對象,另一個是用於執行查詢的Cursor對象。
Python DB-API使用流程:
- 引入 API 模塊。
- 獲取與數據庫的連接。
- 執行SQL語句和存儲過程。
- 關閉數據庫連接。
一、基本使用
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 定義要執行的SQL語句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 執行SQL語句 cursor.execute(sql) # 關閉光標對象 cursor.close() # 關閉數據庫連接 conn.close()
返回字典格式數據:
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句並且將結果作為字典返回的游標 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 定義要執行的SQL語句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 執行SQL語句 cursor.execute(sql) # 關閉光標對象 cursor.close() # 關閉數據庫連接 conn.close()
二、Connection對象
- 用於建立與數據庫的連接
- 創建對象:調用connect()方法
conn=connect(參數列表)
- 參數host:連接的mysql主機,如果本機是'localhost'
- 參數port:連接的mysql主機的端口,默認是3306
- 參數db:數據庫的名稱
- 參數user:連接的用戶名
- 參數password:連接的密碼
- 參數charset:通信采用的編碼方式,默認是'gb2312',要求與數據庫創建時指定的編碼一致,否則中文會亂碼
對象的方法
- close()關閉連接
- commit()事務,所以需要提交才會生效
- rollback()事務,放棄之前的操作
- cursor()返回Cursor對象,用於執行sql語句並獲得結果
三、Cursor對象
- 執行sql語句
- 創建對象:調用Connection對象的cursor()方法
cursor1=conn.cursor()
對象的方法
- close()關閉
- execute(operation [, parameters ])執行語句,返回受影響的行數
- fetchone()執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組
- next()執行查詢語句時,獲取當前行的下一行
- fetchall()執行查詢時,獲取結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回
- scroll(value[,mode])將行指針移動到某個位置
- mode表示移動的方式
- mode的默認值為relative,表示基於當前行移動到value,value為正則向下移動,value為負則向上移動
- mode的值為absolute,表示基於第一條數據的位置,第一條數據的位置為0
對象的屬性
- rowcount只讀屬性,表示最近一次execute()執行后受影響的行數
- connection獲得當前連接對象
四、增刪改查
增
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 # 執行SQL語句 cursor.execute(sql, [username, age]) # 提交事務 conn.commit() cursor.close() conn.close()
插入失敗會回滾:
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 try: # 執行SQL語句 cursor.execute(sql, [username, age]) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
獲取插入數據的ID值
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 try: # 執行SQL語句 cursor.execute(sql, [username, age]) # 提交事務 conn.commit() # 提交之后,獲取剛插入的數據的ID last_id = cursor.lastrowid except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
批量執行插入
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)] try: # 批量執行多條插入SQL語句 cursor.executemany(sql, data) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
刪
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "DELETE FROM USER1 WHERE id=%s;" try: cursor.execute(sql, [4]) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
改
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 修改數據的SQL語句 sql = "UPDATE USER1 SET age=%s WHERE name=%s;" username = "Alex" age = 80 try: # 執行SQL語句 cursor.execute(sql, [age, username]) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()
查
查詢單條記錄
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 查詢數據的SQL語句 sql = "SELECT id,name,age from USER1 WHERE id=1;" # 執行SQL語句 cursor.execute(sql) # 獲取單條查詢數據 ret = cursor.fetchone() cursor.close() conn.close() # 打印下查詢結果 print(ret)
查詢多條記錄
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 查詢數據的SQL語句 sql = "SELECT id,name,age from USER1;" # 執行SQL語句 cursor.execute(sql) # 獲取多條查詢數據 ret = cursor.fetchall() cursor.close() conn.close() # 打印下查詢結果 print(ret)