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”,即:
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()
每个数据表通常都有一个主键(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()
解决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()
查询数据使用 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条件语句
"""
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” 语句放在查询数据最后面;使用 “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()