Python3之连接MySQL数据库(mysql-connector)

一、概述

MySQL 数据库是目前使用频率较高的关系型数据库管理系统,日常Python使用过程中也会经常使用MySQL数据库,可通过使用 mysql-connector 来连接使用 MySQL, mysql-connector 是 MySQL 官方提供的驱动器。

二、安装

Python安装目录,找到Lib\site-packages,在此目录下使用 pip 命令来安装 mysql-connector:

pip install mysql-connector-python mysql-connector-python

pip install mysql-connector

可通过如下方式检验my - connector是否安装成功:xxx.py文件中输入“import mysql.connector”,如不报错,则说明mysql - connector安装成功

注意:假如安装的 MySQL 是 8.0 版本,密码插件验证方式发生了变化,早期版本为 mysql_native_password,8.0 版本为 caching_sha2_password,需要做如下改变:
1、修改 my.ini 配置:

[mysqld]
default_authentication_plugin=mysql_native_password

再在 mysql 下执行如下命令来修改密码:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

参考文档:
1、Python MySQL8.0 版本数据库链接问题
2、MySQL修改安装路径
3、社区版pycharm没有database插件问题
4、Pycharm安装database插件
5、解决PyCharm连接MySql出现时区错误问题
方法A:
a、DOS下进入MySQL安装目录bin下
b、输入 mysql -uroot -p密码
c、输入 set global time_zone = ‘+8:00’;
d、输入 exit
方法B:
默认生成的URL后添加“?serverTimezone=UTC”,即:
Python3之连接MySQL数据库(mysql-connector)_第1张图片

三、修改MySQL数据库root密码方式

1、使用SET PASSWORD命令
登录MySQL:
格式:mysql> set password for 用户名@localhost = password(‘新密码’);
例子:mysql> set password for root@localhost = password(‘888’);

2、使用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 888

3、使用UPDATE编辑user表
登录MySQL:
mysql> use mysql;

mysql> update user set password=password(“123”) where user=“root” and host=“localhost”;

mysql> flush privileges;

四、创建数据库连接

Python连接MySQL数据库可使用如下方式实现:

import mysql.connector

# 1、打开数据库连接
mydatabase = mysql.connector.connect(
    host = "localhost" , # 服务器地址
    user = "root" , # 用户名
    passwd = "qazwsx" # 密码
)

# 使用cursor()方法获取操作游标
cursor = mydatabase.cursor()

print(mydatabase)

五、创建数据库

通常使用"CREATE DATABASE"来创建一个数据库,具体例子如下:

import mysql.connector

# 1、打开数据库连接
mydatabase = mysql.connector.connect(
    host = "localhost" , # 服务器地址
    port = 3306, # 端口
    user = "root" , # 用户名
    passwd = "qazwsx" , # 密码
    buffered = True
)

# 2、使用cursor()方法获取操作游标
cursor = mydatabase.cursor()

# 3.1、判断数据库是否存在,存着则删除
cursor.execute('DROP DATABASE IF EXISTS nba')

# 3.2、判断数据库是否存在,不存着则新建
cursor.execute('CREATE DATABASE IF NOT EXISTS NBA')

# 4、查看所有数据库
cursor.execute("SHOW DATABASES")

# 5、使用 fetchall() 方法获取返回数据
data = cursor.fetchall()

# 6、输出所有数据库名称
print(data)

# 7、关闭数据库连接
mydatabase.close()

注意:
解决Unread result found问题

六、创建数据表

创建数据表使用 “CREATE TABLE” 语句

import mysql.connector

# 建立数据库连接
MyDataBase = mysql.connector.connect(
    host = "localhost",
    user = "root",
    passwd = "qazwsx",
    db = "nba",
    port = 3306
)

# 使用cursor()方法获取操作游标
cursor = MyDataBase.cursor()

# 创建数据表,创建前判断数据表是否存在,不存在则创建
sql = "create table IF NOT EXISTS Player(name VARCHAR(255), number VARCHAR(255) , age VARCHAR(255))"
cursor.execute(sql)

# 显示数据库表结构
cursor.execute("show columns from Player")

# 使用 fetchall() 方法获取返回数据
playerdata = cursor.fetchall()

print(playerdata)

# 关闭数据库连接
MyDataBase.close()

执行成功后,可看见数据表已创建成功
Python3之连接MySQL数据库(mysql-connector)_第2张图片

七、主键设置

每个数据表通常都有一个主键(PRIMARY KEY),可使用 “INT AUTO_INCREMENT PRIMARY KEY” 语句创建主键,主键起始值为 1,逐步递增。
7.1、数据表已创建:使用 ALTER TABLE 添加主键


# 创建数据库链接
MyDataBase = mysql.connector.connect(
    host = "localhost",
    user = "root" ,
    passwd = "qazwsx" ,
    database = "nba" ,
    port = 3306
)

# 获取操作浮标
cursor = MyDataBase.cursor()

# 数据表 Player 添加主键
cursor.execute('alter table Player add column id int auto_increment primary key')

# 创建数据表 student 的同时添加主键
cursor.execute("create table if not EXISTS student(id int auto_increment primary key , name varchar(25) , age varchar(25) , score varchar(25))")

# 显示数据库表结构
cursor.execute("show columns from Player")
#cursor.execute("show columns from student")

# fetchall()返回所有数据
data = cursor.fetchall()

print(data)

# 关闭数据库链接
MyDataBase.close()

执行成功后,可看见数据表主键创建成功:
Python3之连接MySQL数据库(mysql-connector)_第3张图片

八、插入单条和多条数据

解决Not all parameters were used in the SQL statement问题
插入单条数据:insert into
插入多条数据:批量插入使用 executemany() 方法,**executemany()**方法的第二个参数是一个元组列表,包含了需要插入的数据

import mysql.connector

# 建立数据库链接
MyDataBase = mysql.connector.connect(
    host = 'localhost',
    user = 'root',
    passwd = 'qazwsx',
    database = 'nba',
    port = 3306
)

# cursor()获取数据库操作浮标
cursor = MyDataBase.cursor()

"""
1、插入单条数据:insert into
"""
# 执行sql语句插入单条数据
sql = "insert into player (age, name , number) VALUES (%s, %s , %s)"
value = (41 , 'Kobe' , '24')
cursor.execute(sql , value)

'''
2、插入多条数据:executemany()方法
'''
sqlmany = 'insert into player (age, name , number) VALUES (%s, %s , %s)'
values = [(42 , 'KG' , '5') , (30 , 'Curry' , '31')]
cursor.executemany(sqlmany , values)

# 当数据表内容有更新时,必须使用该语句
MyDataBase.commit()

# 输出插入数据条数,数据记录插入数据表后获取该记录的 ID
print("一共%d" % (cursor.rowcount) + "条数据被插入数据表中 ,ID为%d" % cursor.lastrowid)

MyDataBase.close()

结果如下:
Python3之连接MySQL数据库(mysql-connector)_第4张图片

九、查询数据

查询数据使用 SELECT 语句

"""
查询数据
"""

import mysql.connector

# 建立数据库连接
MyConnect = mysql.connector.connect(
    host = "localhost",
    user = 'root',
    passwd = "qazwsx",
    database = 'nba',
    port = 3306
)

# 获取游标
cursor = MyConnect.cursor()

# 执行数据库查询操作
sql = "SELECT * FROM player"
cursor.execute(sql)

# 获取全部返回值
data = cursor.fetchall()

# 仅获取一个返回值
#data = cursor.fetchone()
#print("cursor.fetchall()仅获取一个返回值:" , data)

# 输出查询到的值
for i in data:
    print(i)

输出结果为:

('Kobe', '24', '41', 1)
('KG', '5', '42', 2)
('Curry', '31', '30', 3)

十、where条件语句

使用 where 语句可以读取指定条件的数据

"""
where条件语句
"""

import mysql.connector

# 建立数据库连接
mydatabase = mysql.connector.connect(
    host = "localhost" ,
    user = 'root' ,
    passwd = 'qazwsx' ,
    database = 'nba' ,
    port = 3306
)

# cursor获取数据库游标
mycursor = mydatabase.cursor()

# 查询数据库数据 年龄降序排列
sql = 'select name , age from player where number >= 24'
mycursor.execute(sql)

# 获取所有返回值
data = mycursor.fetchall()

# 输出返回值
for i in data:
    print(i)

# 断开数据库连接
mydatabase.close()

输出结果:

('Kobe', '41')
('Curry', '30')

使用通配符 %查询数据

"""
使用通配符%查询数据
"""
import mysql.connector

# 建立数据库链接
mydatabase = mysql.connector.connect(
    host='localhost',
    user='root',
    passwd='qazwsx',
    database='nba',
    port=3306
)

# 获取游标
cursor = mydatabase.cursor()

# 执行sql语句查询数据
sql = "select number , age from player where name LIKE '%Kobe%'"
cursor.execute(sql)

# 返回一条数据
data = cursor.fetchone()

print(data)

mydatabase.close()

执行结果:

('24', '41')

为防止数据库查询发生 SQL 注入攻击,通常使用 %s 占位符转义查询条件:

"""
为防止数据库查询发生 SQL 注入攻击,通常使用 %s 占位符转义查询条件
"""
import mysql.connector

# 建立数据库链接
mydata = mysql.connector.connect(
    host='127.0.0.1',
    user='root',
    passwd='qazwsx',
    database='nba',
    port=3306
)

# 获取游标
cursor = mydata.cursor()

# 为防止数据库查询发生 SQL 注入攻击,通常使用 %s 占位符转义查询条件
sql = "select * from player where number = %s"
number = ("24",)
cursor.execute(sql , number)

# 获取返回值
data = cursor.fetchall()

for i in data:
    print(data)

mydata.close()

执行结果:

[('Kobe', '24', '41', 1)]

十一、排序

数据库查询结果可以使用 ORDER BY 语句排序,默认的排序方式为升序,关键字为 ASC;若要设置降序排序,关键字 DESC

"""
排序
"""
import mysql.connector

# 建立数据库链接
Connect = mysql.connector.connect(
    host='localhost',
    user='root',
    passwd='qazwsx',
    database='nba',
    port=3306
)

# 获取游标
corsur = Connect.cursor()

# 执行sql
#sql = "select * from player where age >= %s order by age ASC" # ASC:升序 DESC:降序
sql = "select * from player where age >= %s order by age DESC" # ASC:升序 DESC:降序
age=('30' , )
corsur.execute(sql , age)

# 获取返回值
data = corsur.fetchall()

for j in data:
    print(j)

Connect.close()

执行结果:

('KG', '5', '42', 2)
('Kobe', '24', '41', 1)
('Curry', '31', '30', 3)

十二、Limit限制

使用 “LIMIT” 语句可设置查询的数据量,“LIMIT” 语句放在查询数据最后面;使用 “OFFSET” 关键字指定起始位置,其中0为第一条,1为第二条,以此类推

"""
LIMIT限制查询数据返回量
"""
import mysql.connector

# 建立链接
Connect = mysql.connector.connect(
    host='localhost',
    user='root',
    passwd='qazwsx',
    database='nba',
    port=3306
)

# 获取游标
cursor = Connect.cursor()

# SQL查询数据
sql = "select * from player where age <= %s order by age ASC limit 3"
age = ('41' , )
cursor.execute(sql , age)

# 获取返回值
data = cursor.fetchall()

for i in data:
    print(i)

Connect.close()

执行结果:

('Curry', '30', '31', 3)
('Wade', '3', '38', 4)
('Kobe', '24', '41', 1)

十三、删除记录

通常使用 “DELETE FROM” 语句删除记录

"""
删除记录
"""
import mysql.connector

# 建立链接
Connect = mysql.connector.connect(
    host='localhost',
    user='root',
    passwd='qazwsx',
    database='nba',
    port=3306
)

# 获取游标
cursor = Connect.cursor()

# 执行sql
sql = "delete from player where name = %s"
name = ("KG" , )
cursor.execute(sql,name)

#数据表内容有更新,必须使用到commit()语句
Connect.commit()

# 统计被删除数据条数
print(cursor.rowcount , "条记录被删除")

# 查询剩余数据
cursor.execute("select * from player")

# 返回所有数据
data=cursor.fetchall()

for i in data:
    print(i)

# 关闭链接
Connect.close()

执行结果:

1 条记录被删除
('Kobe', '24', '41', 1)
('Curry', '30', '31', 3)
('Wade', '3', '38', 4)
('KD', '7', '30', 5)

十四、更新数据表

通常使用 “UPDATE” 语句实现数据表更新

"""
更新数据表
"""
import mysql.connector

# 建立链接
Connect = mysql.connector.connect(
    host='localhost',
    user='root',
    passwd='qazwsx',
    database='nba',
    port=3306
)

# 获取游标
cursor = Connect.cursor()

# 执行sql
sql= "update player set id = %s where name = %s"
id = ('2' , "KD")
cursor.execute(sql,id)

# 刷新数据库
Connect.commit()

# 查询更新后ID
sql1 = "select id from player where name = %s"
name=("KD",)
cursor.execute(sql1,name)

# 获取返回值
data = cursor.fetchone()

print(data)

# 关闭链接
Connect.close()

十五、删除表

删除表使用 “DROP TABLE” 语句, IF EXISTS 关键字用于判断表是否存在,只有存在的情况才删除表

"""
删除表
"""

import mysql.connector

# 建立链接
Connect = mysql.connector.connect(
    host='localhost',
    user='root',
    passwd='qazwsx',
    database='nba',
    port=3306
)

# 获取游标
cursor = Connect.cursor()

# 执行sql
sql= "drop table if EXISTS student"
cursor.execute(sql)

# 关闭链接
Connect.close()

你可能感兴趣的:(Python)