Python操作MySQL及常見問題處理
Python操作MySQL的前提已安裝MySQL數據庫管理系統軟件。還需要安裝連接MySQL的模塊(包)如pymysql。
關於MySQ數據庫管理系統的安裝,可以參見:
https://blog.csdn.net/cnds123/article/details/104454487
MySQL是Web世界中使用最廣泛的數據庫服務器。是爲服務器端設計的數據庫。
連接MySQL一般使用pymysql包。
安裝pymysql包可在cmd窗口中使用pip install pymysql命令。
【Python第三方模塊(庫、包)安裝、卸載與查看
https://mp.csdn.net/console/editor/html/104393385
】
Python使用PyMySQL模塊操作MySQL的步驟順序:
建立連接
獲取遊標
執行SQL語句
關閉(遊標、連接)
參見下圖:
Connection對象
- 用於建立與數據庫的連接
- 創建對象:調用connect()方法
conn=connect(參數列表)
參數之間用英文逗號分隔
- 參數host:連接的mysql主機,如果本機是'localhost'
- 參數port:連接的mysql主機的端口,默認是3306
- 參數database:數據庫的名稱
- 參數user:連接的用戶名
- 參數password:連接的密碼
- 參數charset:通信採用的編碼方式,推薦使用utf8,對於mysql新版本使用utf8mb4。
Connection對象常用方法
- close()關閉連接
- commit()提交
- rollback()事務,放棄之前的操作
- cursor()返回Cursor對象,用於執行sql語句並獲得結果
Cursor對象
- 用於執行sql語句,使用頻度最高的語句爲select、insert、update、delete
- 創建(獲取)Cursor對象:調用Connection對象的cursor()方法
如cursorA =conn.cursor()
Cursor對象常用方法
- close()關閉
- execute(operation [, parameters ])執行語句,返回受影響的行數,主要用於執行insert、update、delete語句,也可以執行create、alter、drop等語句
- fetchone()執行查詢語句時,獲取查詢結果集的第一個行數據。
- fetchall()執行查詢時,獲取結果集的所有行。
- next()執行查詢語句時,獲取當前行的下一行
- croll(value[,mode])將行指針移動到某個位置
mode表示移動的方式,默認值爲relative,表示基於當前行移動到value,value爲正則向下移動,value爲負則向上移動;值爲absolute,表示基於第一條數據的位置,第一條數據的位置爲0
對象的屬性
- rowcount只讀屬性,表示最近一次execute()執行後受影響的行數
- connection獲得當前連接對象
例1、 python + pymysql 創建名爲test_db的數據庫
#引入pymysql模塊(包)
import pymysql
# 創建連接
conn = pymysql.connect(host='localhost', user='root', password='')
# 創建遊標
cursorA = conn.cursor()
# 創建數據庫的sql
sql = "CREATE DATABASE test_db"
try:
# 執行創建數據庫的sql
cursorA.execute(sql)
print("數據庫創建成功")
except pymysql.Error as e:
print(e)
#關閉遊標
cursorA.close()
#關閉數據庫連接
conn.close()
說明:Connect() 方法用於創建數據庫的連接,返回數據庫連接對象,其中需要指定參數:用戶名,密碼,主機等信息。存在中文的時候,連接需要添加charset='utf8',否則中文顯示亂碼。
保存文件名pymysqlTestDB.py,運行結果如下:
此時,將在MySQL安裝目錄的Data文件夾建立test_db數據庫(表現爲名爲test_db文件夾,此時該文件夾是空的)
例2、python + pymysql 連接名爲test_db的數據庫,在其中新建名爲user1的表
# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db')
# 得到一個可以執行SQL語句的光標對象
cursorA = conn.cursor()
# 定義要執行的SQL語句
sql = """
CREATE TABLE IF NOT EXISTS user1 (
id INT auto_increment PRIMARY KEY ,
name CHAR(10) NOT NULL UNIQUE,
age TINYINT NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8mb4;
"""
try:
# 執行SQL語句
cursorA.execute(sql)
print("表創建成功");
except pymysql.Warning as e:
print(e)
# 關閉光標對象
cursorA.close()
# 關閉數據庫連接
conn.close()
保存文件名pymysqlTABLE.py,運行結果如下:
【注意:
1、其中的CREATE TABLE IF NOT EXISTS user1 可改爲CREATE TABLE user1
IF NOT EXISTS表示“如果不存在”,你可以自行對比兩者。
2、其中的CHARSET=utf8mb4
對以前的MySQL版本使用charset='utf8',對於新版本的MySQL需要改爲 CHARSET=utf8mb4
若對新版本的MySQL使用 charset='utf8',則運行時會出現如下提示:
Warning (from warnings module):
File "D:\Users\Wang\AppData\Local\Programs\Python\Python38\lib\site-packages\pymysql\cursors.py", line 170
result = self._query(query)
Warning: (3719, "'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.")
】
例3、python + pymysql 連接名爲test_db的數據庫,對其中名爲user1的表增加數據。
#批量增加
# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db',charset='utf8mb4')
# 得到一個可以執行SQL語句的光標對象
cursorA = conn.cursor()
sql = "INSERT INTO user1(name, age) VALUES (%s, %s);"
data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]
try:
# 批量執行多條插入SQL語句
cursorA.executemany(sql, data)
# 提交事務
conn.commit()
except Exception as e:
print(e)
# 有異常,回滾事務
conn.rollback()
cursorA.close()
conn.close()
其中,conn.commit(),提交事務,如果是向數據庫插入一條數據後,必須使用該命令,否則數據不會被真正的寫入。
保存文件名BatchAadd.py。
例4、python + pymysql 連接名爲test_db的數據庫,查詢名爲user1的表中的數據。
#查詢
# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db',charset='utf8mb4')
# 得到一個可以執行SQL語句的光標對象
cursorA = conn.cursor()
# 查詢數據的SQL語句
sql = "SELECT id,name,age FROM user1;"
# 執行SQL語句
cursorA.execute(sql)
# 獲取多條查詢數據
ret = cursorA.fetchall()
cursorA.close()
conn.close()
# 打印下查詢結果
print(ret)
保存文件名QueryData.py。運行結果如下:
查詢條件帶變量的例子
這種方法更具有靈活性,在某些場所更具有實用價值。
例5、python + pymysql 連接名爲test_db的數據庫,使用條件帶變量查詢名爲user1的表中的數據
#查詢條件帶變量
# 導入pymysql模塊
import pymysql
# 連接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db',charset='utf8mb4')
# 得到一個可以執行SQL語句的光標對象
cursorA = conn.cursor()
# 查詢數據的SQL語句,查詢條件使用變量
nameA="Alex"
ageA =18
sql = "SELECT id,name,age FROM user1 WHERE name='%s'AND age = '%s'"%(nameA,ageA)
#sql = "SELECT id,name,age FROM user1 WHERE name='Alex'"
# 執行SQL語句
cursorA.execute(sql)
#cursorA.execute("SELECT id,name,age FROM user1 WHERE name='%s'"%(nameA))
# 獲取多條查詢數據
ret = cursorA.fetchall()
cursorA.close()
conn.close()
# 打印下查詢結果
print(ret)
保存文件名QueryWithVariable.py。運行結果如下:
關於pymysql模塊
https://www.cnblogs.com/Felix-DoubleKing/p/10090668.html