1. 介紹
MySQL 是最流行的關係型數據庫管理系統,mysql-connector 來連接使用 MySQL, mysql-connector 是 MySQL 官方提供的驅動器。
2. 安裝
$ pip install mysql-connector
注意:如果你的 MySQL 是 8.0 版本,密碼插件驗證方式發生了變化,早期版本爲 mysql_native_password,8.0 版本爲 caching_sha2_password,所以需要做些改變:
先修改 my.ini 配置:
[mysqld]
default_authentication_plugin=mysql_native_password
然後在 mysql 下執行以下命令來修改密碼:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密碼';
3. 用法
3.1 創建數據庫連接
import mysql.connector
mydb = mysql.connector.connect(
host="192.168.1.190",
user="root",
passwd="Password01!"
)
print(mydb)
輸出:
python my2.py
<mysql.connector.connection.MySQLConnection object at 0x7ff34aa24410>
3.2 創建數據庫
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE DATABASE runoob_db;")
3.3 查看數據庫是否存在
import mysql.connector
mydb = mysql.connector.connect(
host="192.168.1.190",
user="root",
passwd="Password01!"
)
mycursor = mydb.cursor()
mycursor.execute("SHOW DATABASES;")
for x in mycursor:
print(x)
輸出:
$ python my1.py
(u'information_schema',)
(u'api_server',)
(u'api_server_test',)
(u'horus',)
(u'mgm',)
(u'mysql',)
(u'mysqlmanager',)
(u'performance_schema',)
(u'redismanager',)
(u'sys',)
3.4 創建數據表
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))")
3.5 查看數據表是否已存在
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
mycursor.execute("SHOW TABLES")
for x in mycursor:
print(x)
3.6 主鍵設置
給 sites 表添加主鍵
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
mycursor.execute("ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")
給表創建主鍵
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))")
3.7 插入數據
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = ("RUNOOB", "https://www.runoob.com")
mycursor.execute(sql, val)
mydb.commit() # 數據表內容有更新,必須使用到該語句
print(mycursor.rowcount, "記錄插入成功。")
3.8 批量插入
批量插入使用 executemany() 方法
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "INSERT INTO sites (name, url) VALUES (%s, %s)"
val = [
('Google', 'https://www.google.com'),
('Github', 'https://www.github.com'),
('Taobao', 'https://www.taobao.com'),
('stackoverflow', 'https://www.stackoverflow.com/')
]
mycursor.executemany(sql, val)
mydb.commit() # 數據表內容有更新,必須使用到該語句
print(mycursor.rowcount, "記錄插入成功。")
print("1 條記錄已插入, ID:", mycursor.lastrowid)
3.9 查詢數據
3.9.1 獲取所有記錄
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchall() # fetchall() 獲取所有記錄
for x in myresult:
print(x)
輸出:
(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(6, 'Zhihu', 'https://www.zhihu.com')
3.9.2 只想讀取一條數據,可以使用 fetchone() 方法
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM sites")
myresult = mycursor.fetchone()
print(myresult)
輸出結果爲:
(1, 'RUNOOB', 'https://www.runoob.com')
3.9.3 排序
查詢結果排序可以使用 ORDER BY
語句,默認的排序方式爲升序,關鍵字爲 ASC
,如果要設置降序排序,可以設置關鍵字 DESC
。
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM sites ORDER BY name"
#sql = "SELECT * FROM sites ORDER BY name DESC" #降序
#mycursor.execute("SELECT * FROM sites LIMIT 3") #通過 "LIMIT" 語句設置查詢的數據量
#mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1") 使用的關鍵字是 OFFSET指定起始位置
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
3.9.4 了防止數據庫查詢發生 SQL 注入的攻擊,我們可以使用 %s 佔位符來轉義查詢的條件。
升序
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM sites WHERE name = %s"
na = ("RUNOOB", )
mycursor.execute(sql, na)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
輸出結果爲:
(3, 'Github', 'https://www.github.com')
(2, 'Google', 'https://www.google.com')
(1, 'RUNOOB', 'https://www.runoob.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(4, 'Taobao', 'https://www.taobao.com')
(6, 'Zhihu', 'https://www.zhihu.com')
3.10 刪除記錄
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "DELETE FROM sites WHERE name = 'stackoverflow'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, " 條記錄刪除")
爲了防止數據庫查詢發生 SQL 注入的攻擊,我們可以使用 %s 佔位符來轉義刪除語句的條件
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "DELETE FROM sites WHERE name = %s"
na = ("stackoverflow", )
mycursor.execute(sql, na)
mydb.commit()
print(mycursor.rowcount, " 條記錄刪除")
3.11 更新表數據
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "UPDATE sites SET name = 'ZH' WHERE name = 'Zhihu'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, " 條記錄被修改")
輸出結果爲:
1 條記錄被修改
爲了防止數據庫查詢發生 SQL 注入的攻擊,我們可以使用 %s 佔位符來轉義更新語句的條件
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "UPDATE sites SET name = %s WHERE name = %s"
val = ("Zhihu", "ZH")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, " 條記錄被修改")
輸出結果爲:
1 條記錄被修改
3.12 刪除表
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="123456",
database="runoob_db"
)
mycursor = mydb.cursor()
sql = "DROP TABLE IF EXISTS sites" # 刪除數據表 sites
mycursor.execute(sql)
參考資料:
https://www.runoob.com/python3/python-mysql-connector.html