菜鸟教程 -- 学的不仅是技术,更是梦想!

Python 3 教程
Python3 教程 Python3 简介 Python3 环境搭建 Python3 VScode Python3 基础语法 Python3 基本数据类型 Python3 数据类型转换 Python3 解释器 Python3 注释 Python3 运算符 Python3 数字(Number) Python3 字符串 Python3 列表 Python3 元组 Python3 字典 Python3 集合 Python3 条件控制 Python3 循环语句 Python3 编程第一步 Python3 推导式 Python3 迭代器与生成器 Python3 with Python3 函数 Python3 lambda Python3 装饰器 Python3 数据结构 Python3 模块 Python __name__ Python3 输入和输出 Python3 File Python3 OS Python3 错误和异常 Python3 面向对象 Python3 命名空间/作用域 Python 虚拟环境的创建 Python 类型注解 Python3 标准库概览 Python3 实例 Python 测验

Python3 高级教程

Python3 正则表达式 Python3 CGI编程 Python3 MySQL(mysql-connector) Python3 MySQL(PyMySQL) Python3 网络编程 Python3 SMTP发送邮件 Python3 多线程 Python3 XML 解析 Python3 JSON Python3 日期和时间 Python3 内置函数 Python3 MongoDB Python3 urllib Python uWSGI 安装配置 Python3 pip Python3 operator Python math Python requests Python random Python OpenAI Python 有用的资源 Python AI 绘画 Python statistics Python hashlib Python 量化 Python pyecharts Python selenium 库 Python 爬虫 Python Scrapy 库 Python Markdown Python sys 模块 Python Pickle 模块 Python subprocess 模块 Python queue 模块 Python StringIO 模块 Python logging 模块 Python datetime 模块 Python re 模块 Python csv 模块 Python threading 模块 Python asyncio 模块 Python PyQt Python for 循环 Python while 循环
(追記) (追記ここまで)

Python MySQL - mysql-connector 驱动

MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读我们的 MySQL 教程。

本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql-connectorMySQL 官方提供的驱动器。

我们可以使用 pip 命令来安装 mysql-connector:

python -m pip install mysql-connector

使用以下代码测试 mysql-connector 是否安装成功:

demo_mysql_test.py:

importmysql.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 '新密码';

更多内容可以参考:Python MySQL8.0 链接问题


创建数据库连接

可以使用以下代码来连接数据库:

demo_mysql_test.py:

importmysql.connectormydb = mysql.connector.connect(host="localhost", # 数据库主机地址user="yourusername", # 数据库用户名passwd="yourpassword"# 数据库密码)print(mydb)

创建数据库

创建数据库使用 "CREATE DATABASE" 语句,以下创建一个名为 runoob_db 的数据库:

demo_mysql_test.py:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456")mycursor = mydb.cursor()mycursor.execute("CREATE DATABASE runoob_db")

创建数据库前我们也可以使用 "SHOW DATABASES" 语句来查看数据库是否存在:

demo_mysql_test.py:

输出所有数据库列表:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456")mycursor = mydb.cursor()mycursor.execute("SHOW DATABASES")forxinmycursor: print(x)

或者我们可以直接连接数据库,如果数据库不存在,会输出错误信息:

demo_mysql_test.py:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")

创建数据表

创建数据表使用 "CREATE TABLE" 语句,创建数据表前,需要确保数据库已存在,以下创建一个名为 sites 的数据表:

demo_mysql_test.py:

importmysql.connectormydb = 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))")
执行成功后,我们可以看到数据库创建的数据表 sites,字段为 name 和 url。 我们也可以使用 "SHOW TABLES" 语句来查看数据表是否已存在:

demo_mysql_test.py:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()mycursor.execute("SHOW TABLES")forxinmycursor: print(x)

主键设置

创建表的时候我们一般都会设置一个主键(PRIMARY KEY),我们可以使用 "INT AUTO_INCREMENT PRIMARY KEY" 语句来创建一个主键,主键起始值为 1,逐步递增。

如果我们的表已经创建,我们需要使用 ALTER TABLE 来给表添加主键:

demo_mysql_test.py:

给 sites 表添加主键。

importmysql.connectormydb = 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")

如果你还未创建 sites 表,可以直接使用以下代码创建。

demo_mysql_test.py:

给表创建主键。

importmysql.connectormydb = 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))")

插入数据

插入数据使用 "INSERT INTO" 语句:

demo_mysql_test.py:

向 sites 表插入一条记录。

importmysql.connectormydb = 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, "记录插入成功。")

执行代码,输出结果为:

1 记录插入成功

批量插入

批量插入使用 executemany() 方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据:

demo_mysql_test.py:

向 sites 表插入多条记录。

importmysql.connectormydb = 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, "记录插入成功。")

执行代码,输出结果为:

4 记录插入成功。

执行以上代码后,我们可以看看数据表的记录:

如果我们想在数据记录插入后,获取该记录的 ID ,可以使用以下代码:

demo_mysql_test.py:

importmysql.connectormydb = 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 = ("Zhihu", "https://www.zhihu.com")mycursor.execute(sql, val)mydb.commit()print("1 条记录已插入, ID:", mycursor.lastrowid)

执行代码,输出结果为:

1 条记录已插入, ID: 6

查询数据

查询数据使用 SELECT 语句:

demo_mysql_test.py:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()mycursor.execute("SELECT * FROM sites")myresult = mycursor.fetchall()# fetchall() 获取所有记录forxinmyresult: 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')

也可以读取指定的字段数据:

demo_mysql_test.py:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()mycursor.execute("SELECT name, url FROM sites")myresult = mycursor.fetchall()forxinmyresult: print(x)

执行代码,输出结果为:

('RUNOOB', 'https://www.runoob.com')
('Google', 'https://www.google.com')
('Github', 'https://www.github.com')
('Taobao', 'https://www.taobao.com')
('stackoverflow', 'https://www.stackoverflow.com/')
('Zhihu', 'https://www.zhihu.com')

如果我们只想读取一条数据,可以使用 fetchone() 方法:

demo_mysql_test.py:

importmysql.connectormydb = 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')

where 条件语句

如果我们要读取指定条件的数据,可以使用 where 语句:

demo_mysql_test.py

读取 name 字段为 RUNOOB 的记录:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()sql = "SELECT * FROM sites WHERE name ='RUNOOB'"mycursor.execute(sql)myresult = mycursor.fetchall()forxinmyresult: print(x)

执行代码,输出结果为:

(1, 'RUNOOB', 'https://www.runoob.com')

也可以使用通配符 %:

demo_mysql_test.py

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()sql = "SELECT * FROM sites WHERE url LIKE '%oo%'"mycursor.execute(sql)myresult = mycursor.fetchall()forxinmyresult: print(x)

执行代码,输出结果为:

(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')

为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义查询的条件:

demo_mysql_test.py

importmysql.connectormydb = 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()forxinmyresult: print(x)

排序

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

demo_mysql_test.py

按 name 字段字母的升序排序:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()sql = "SELECT * FROM sites ORDER BY name"mycursor.execute(sql)myresult = mycursor.fetchall()forxinmyresult: 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')

降序排序实例:

demo_mysql_test.py

按 name 字段字母的降序排序:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()sql = "SELECT * FROM sites ORDER BY name DESC"mycursor.execute(sql)myresult = mycursor.fetchall()forxinmyresult: print(x)

执行代码,输出结果为:

(6, 'Zhihu', 'https://www.zhihu.com')
(4, 'Taobao', 'https://www.taobao.com')
(5, 'stackoverflow', 'https://www.stackoverflow.com/')
(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')

Limit

如果我们要设置查询的数据量,可以通过 "LIMIT" 语句来指定

demo_mysql_test.py

读取前 3 条记录:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()mycursor.execute("SELECT * FROM sites LIMIT 3")myresult = mycursor.fetchall()forxinmyresult: print(x)

执行代码,输出结果为:

(1, 'RUNOOB', 'https://www.runoob.com')
(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')

也可以指定起始位置,使用的关键字是 OFFSET:

demo_mysql_test.py

从第二条开始读取前 3 条记录:

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()mycursor.execute("SELECT * FROM sites LIMIT 3 OFFSET 1")# 0 为 第一条,1 为第二条,以此类推myresult = mycursor.fetchall()forxinmyresult: print(x)

执行代码,输出结果为:

(2, 'Google', 'https://www.google.com')
(3, 'Github', 'https://www.github.com')
(4, 'Taobao', 'https://www.taobao.com')

删除记录

删除记录使用 "DELETE FROM" 语句:

demo_mysql_test.py

删除 name 为 stackoverflow 的记录:

importmysql.connectormydb = 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, " 条记录删除")

执行代码,输出结果为:

1 条记录删除

注意:要慎重使用删除语句,删除语句要确保指定了 WHERE 条件语句,否则会导致整表数据被删除。

为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义删除语句的条件:

demo_mysql_test.py

importmysql.connectormydb = 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, " 条记录删除")

执行代码,输出结果为:

1 条记录删除

更新表数据

数据表更新使用 "UPDATE" 语句:

demo_mysql_test.py

将 name 为 Zhihu 的字段数据改为 ZH:

importmysql.connectormydb = 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 条记录被修改

注意:UPDATE 语句要确保指定了 WHERE 条件语句,否则会导致整表数据被更新。

为了防止数据库查询发生 SQL 注入的攻击,我们可以使用 %s 占位符来转义更新语句的条件:

demo_mysql_test.py

importmysql.connectormydb = 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 条记录被修改

删除表

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

demo_mysql_test.py

importmysql.connectormydb = mysql.connector.connect(host="localhost", user="root", passwd="123456", database="runoob_db")mycursor = mydb.cursor()sql = "DROP TABLE IF EXISTS sites"# 删除数据表 sitesmycursor.execute(sql)
AI 思考中...

3 篇笔记 写笔记

  1. #0

    跟着菜鸟教程学习 Python3 进行到 python3 mysql(mysql-connector),然后安装mysql-8.0.16,照着示例程序运行 python,遇到这个大大的问题:

    authentication plugin 'calling_sha2_password' is not supported.

    在网上找了无数答案,现在来总结一下。

    根目录下新建 my.ini 文件,设置 MySQL 复制以下配置信息到新建的 my.ini 文件中。

    [mysqld]
    # 设置3306端口
    port = 3306
    # 设置mysql的安装目录
    basedir=D:\\web\\mysql-8.0.16-winx64
    # 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
    # datadir=D:\\web\\sqldata
    # 允许最大连接数
    max_connections=20
    # 服务端使用的字符集默认为8比特编码的latin1字符集
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    # 默认使用“mysql_native_password”插件认证
    default_authentication_plugin=mysql_native_password
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8
    [client]
    # 设置mysql客户端连接服务端时默认使用的端口
    port=3306
    default-character-set=utf8

    在 MySQL 8.0 中验证插件和密码加密方式发生了变化,caching_sha2_password 是默认的身份验证插件而不是之前版本的 mysql_native_password。

    使用指令:

    use mysql;
    select plugin,authentication_string from user;

    查看。

    因此如果需要保持之前的验证方式并保持之前版本的密码加密方式需要在配置文件中修改,暂不支持动态修改,需要重启生效。即:

    # 默认使用 mysql_native_password 插件认证
    default_authentication_plugin=mysql_native_password 

    将 8.0 已有的 sha2 密码修改为 sha1 的模式:

    # 修改加密规则为永不过期
    #注意:password 改为你的密码,别老老实实照抄,之前本人便以为 password 指代密码不用改变,结果一通指令下去,mysql 登不上了,只好重新初始化数据库
    ALTER USER 'root'@'127.0.0.1' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
    #更新一下用户的密码加密方式为之前版本的方式
    ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'password';  
    #刷新权限
    FLUSH PRIVILEGES; 

    重启,这是再看,已经修改了身份验证插件。

    这时再稍稍修改实例程序,便可以连接了:

    import mysql.connector
    mydb=mysql.connector.connect(
     host="localhost",
     user="ly",
     passwd="123456",
     auth_plugin='mysql_native_password'
    )
    print(mydb)
    lsw005 7年前 (2019年08月17日)
  2. #0

    进击的小姐姐

    152***[email protected]

    24

    楼上的问题:

    authentication plugin 'calling_sha2_password' is not supported.

    我也出现了,原因以及解决方法是:我安装的是 mysql-connector ,应该安装 mysql-connector-python。

    安装:

    python3 -m pip install mysql-connector

    进击的小姐姐

    152***[email protected]

    7年前 (2019年09月03日)
  3. #0

    当然是祢豆子啦

    244***[email protected]

    参考地址

    14

    接上问题,出现:

    authentication plugin 'calling_sha2_password' is not supported.

    错误一般是因为connector与使用的python版本不匹配,python下应该使用下面的命令安装。

    python -m pip install mysql-connector-python #这个是为系统默认的python版本安装
    python3 -m pip install mysql-connector-python #这个是为python3版本安装,当你的电脑里有不同的python版本,而且默认版本不是python3时才使用

    另外要注意,在python中连接MySQL时,首先要用"net start mysql"启动MySQL服务。否则会出现如下错误

    mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'localhost:3306' (10061 由于目标计算机积极拒绝,无法连接。)

    当然是祢豆子啦

    244***[email protected]

    参考地址

    7年前 (2019年11月06日)

点我分享笔记

  • 昵称 (必填)
  • 邮箱 (必填)
  • 引用地址

AltStyle によって変換されたページ (->オリジナル) /