Python操作MySQL及常见问题处理
Python操作MySQL的前提已安装MySQL数据库管理系统软件。还需要安装连接MySQL的模块(包)如pymysql。
关于MySQ数据库管理系统的安装,可以参见:
https://blog.csdn.net/cnds123/article/details/104454487
MySQL是Web世界中使用最广泛的数据库服务器。是为服务器端设计的数据库。
连接MySQL一般使用pymysql包。
安装pymysql包可在cmd窗口中使用pip install pymysql命令。
【Python第三方模块(库、包)安装、卸载与查看
https://mp.csdn.net/console/editor/html/104393385
】
Python使用PyMySQL模块操作MySQL的步骤顺序:
建立连接
获取游标
执行SQL语句
关闭(游标、连接)
参见下图:
Connection对象
- 用于建立与数据库的连接
- 创建对象:调用connect()方法
conn=connect(参数列表)
参数之间用英文逗号分隔
- 参数host:连接的mysql主机,如果本机是'localhost'
- 参数port:连接的mysql主机的端口,默认是3306
- 参数database:数据库的名称
- 参数user:连接的用户名
- 参数password:连接的密码
- 参数charset:通信采用的编码方式,推荐使用utf8,对于mysql新版本使用utf8mb4。
Connection对象常用方法
- close()关闭连接
- commit()提交
- rollback()事务,放弃之前的操作
- cursor()返回Cursor对象,用于执行sql语句并获得结果
Cursor对象
- 用于执行sql语句,使用频度最高的语句为select、insert、update、delete
- 创建(获取)Cursor对象:调用Connection对象的cursor()方法
如cursorA =conn.cursor()
Cursor对象常用方法
- close()关闭
- execute(operation [, parameters ])执行语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句
- fetchone()执行查询语句时,获取查询结果集的第一个行数据。
- fetchall()执行查询时,获取结果集的所有行。
- next()执行查询语句时,获取当前行的下一行
- croll(value[,mode])将行指针移动到某个位置
mode表示移动的方式,默认值为relative,表示基于当前行移动到value,value为正则向下移动,value为负则向上移动;值为absolute,表示基于第一条数据的位置,第一条数据的位置为0
对象的属性
- rowcount只读属性,表示最近一次execute()执行后受影响的行数
- connection获得当前连接对象
例1、 python + pymysql 创建名为test_db的数据库
#引入pymysql模块(包)
import pymysql
# 创建连接
conn = pymysql.connect(host='localhost', user='root', password='')
# 创建游标
cursorA = conn.cursor()
# 创建数据库的sql
sql = "CREATE DATABASE test_db"
try:
# 执行创建数据库的sql
cursorA.execute(sql)
print("数据库创建成功")
except pymysql.Error as e:
print(e)
#关闭游标
cursorA.close()
#关闭数据库连接
conn.close()
说明:Connect() 方法用于创建数据库的连接,返回数据库连接对象,其中需要指定参数:用户名,密码,主机等信息。存在中文的时候,连接需要添加charset='utf8',否则中文显示乱码。
保存文件名pymysqlTestDB.py,运行结果如下:
此时,将在MySQL安装目录的Data文件夹建立test_db数据库(表现为名为test_db文件夹,此时该文件夹是空的)
例2、python + pymysql 连接名为test_db的数据库,在其中新建名为user1的表
# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db')
# 得到一个可以执行SQL语句的光标对象
cursorA = conn.cursor()
# 定义要执行的SQL语句
sql = """
CREATE TABLE IF NOT EXISTS user1 (
id INT auto_increment PRIMARY KEY ,
name CHAR(10) NOT NULL UNIQUE,
age TINYINT NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8mb4;
"""
try:
# 执行SQL语句
cursorA.execute(sql)
print("表创建成功");
except pymysql.Warning as e:
print(e)
# 关闭光标对象
cursorA.close()
# 关闭数据库连接
conn.close()
保存文件名pymysqlTABLE.py,运行结果如下:
【注意:
1、其中的CREATE TABLE IF NOT EXISTS user1 可改为CREATE TABLE user1
IF NOT EXISTS表示“如果不存在”,你可以自行对比两者。
2、其中的CHARSET=utf8mb4
对以前的MySQL版本使用charset='utf8',对于新版本的MySQL需要改为 CHARSET=utf8mb4
若对新版本的MySQL使用 charset='utf8',则运行时会出现如下提示:
Warning (from warnings module):
File "D:\Users\Wang\AppData\Local\Programs\Python\Python38\lib\site-packages\pymysql\cursors.py", line 170
result = self._query(query)
Warning: (3719, "'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.")
】
例3、python + pymysql 连接名为test_db的数据库,对其中名为user1的表增加数据。
#批量增加
# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db',charset='utf8mb4')
# 得到一个可以执行SQL语句的光标对象
cursorA = conn.cursor()
sql = "INSERT INTO user1(name, age) VALUES (%s, %s);"
data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]
try:
# 批量执行多条插入SQL语句
cursorA.executemany(sql, data)
# 提交事务
conn.commit()
except Exception as e:
print(e)
# 有异常,回滚事务
conn.rollback()
cursorA.close()
conn.close()
其中,conn.commit(),提交事务,如果是向数据库插入一条数据后,必须使用该命令,否则数据不会被真正的写入。
保存文件名BatchAadd.py。
例4、python + pymysql 连接名为test_db的数据库,查询名为user1的表中的数据。
#查询
# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db',charset='utf8mb4')
# 得到一个可以执行SQL语句的光标对象
cursorA = conn.cursor()
# 查询数据的SQL语句
sql = "SELECT id,name,age FROM user1;"
# 执行SQL语句
cursorA.execute(sql)
# 获取多条查询数据
ret = cursorA.fetchall()
cursorA.close()
conn.close()
# 打印下查询结果
print(ret)
保存文件名QueryData.py。运行结果如下:
查询条件带变量的例子
这种方法更具有灵活性,在某些场所更具有实用价值。
例5、python + pymysql 连接名为test_db的数据库,使用条件带变量查询名为user1的表中的数据
#查询条件带变量
# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host='localhost', user='root',password='', database='test_db',charset='utf8mb4')
# 得到一个可以执行SQL语句的光标对象
cursorA = conn.cursor()
# 查询数据的SQL语句,查询条件使用变量
nameA="Alex"
ageA =18
sql = "SELECT id,name,age FROM user1 WHERE name='%s'AND age = '%s'"%(nameA,ageA)
#sql = "SELECT id,name,age FROM user1 WHERE name='Alex'"
# 执行SQL语句
cursorA.execute(sql)
#cursorA.execute("SELECT id,name,age FROM user1 WHERE name='%s'"%(nameA))
# 获取多条查询数据
ret = cursorA.fetchall()
cursorA.close()
conn.close()
# 打印下查询结果
print(ret)
保存文件名QueryWithVariable.py。运行结果如下:
关于pymysql模块
https://www.cnblogs.com/Felix-DoubleKing/p/10090668.html