python mysql-connector模塊連接數據庫詳解

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章