pymysql是从Python连接到MySQL数据库服务器的接口,其官方文档为:https://pymysql.readthedocs.io/en/latest/
安装:pip install pymysql
对于数据库的操作,我们一般是这样的操作:
步骤1:连接数据库
步骤2:数据库的操作(增删改查)
步骤3:关闭数据库连接
以下是pymysql经常被用到的一些方法
方法 | 描述 |
---|---|
pymysql.connect() | connect()方法返回要给数据库连接对象,参数可以传入很多,常用的参数有:host、port、user、password、database、charset,connect()创建了连接对象,执行完sql操作后,必须使用close()关闭 |
close() | 数据库连接对象的一个方法,用于关闭数据库连接 |
cursor() | 数据库连接对象的一个方法,用于获取游标对象,游标对象的execute(sql语句)方法可以执行sql语句 |
execute(sql) | 游标对象的一个方法,可以执行sql语句 |
commit() | 提交到数据库,数据库连接对象的一个方法,如果对表数据有修改的时候,就需要将修改提交到数据库,否则修改没有生效 |
rollback() | 回滚已提交的内容,,数据库连接对象的一个方法,依据事务的原子性 ,提交要么全部生效,要么全不生效,如果遇到异常,需要对已提交的内容进行回滚 |
方法 | 描述 |
---|---|
pymysql.connect() | connect()方法返回要给数据库连接对象,参数可以传入很多,常用的参数有:host、port、user、password、database、charset,connect()创建了连接对象,执行完sql操作后,必须使用close()关闭 |
close() | 数据库连接对象的一个方法,用于关闭数据库连接 |
简单示例:
import pymysql
# 建立连接
conn = pymysql.connect(host="localhost",
port=3306,
user="root",
password="wen",
database="mysql",
charset="utf8mb4")
# 关闭连接
conn.close()
mysql的操作一般归纳为数据库、表、表数据的增删改查
功能 | 描述 |
---|---|
创建表 | create table 表名 (column_name column_type); |
删除表 | drop table 表名; |
查询表数据 | select 字段名1,字段名2,…,字段名n from 表名 where xxx [limit n][offset m]; |
插入表数据 | insert into 表名(字段名1,字段名2,…,字段名n) values(值1,值2,…,值n),(值21,值22,…,值2n)… ; |
更新表数据 | update 表名 set 字段名1=新值1,字段名2=新值2,…,字段名n=新值n where xxx; |
删除表数据 | delete from 表名 where xxx; |
示例:
import pymysql
# 建立连接
conn = pymysql.connect(host="localhost",
port=3306,
user="root",
password="wen",
database="test",
charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor() # 获取游标对象
cursor.execute("show tables;")
print(f"当前test库的表有(创建表前):{cursor.fetchall()}")
# 创建表
creat_table_sql = """
create table person(
`id` int unsigned auto_increment primary key,
`name` varchar(40) not null,
`birthday` date);
"""
cursor.execute(creat_table_sql)
cursor.execute("show tables;")
print(f"当前test库的表有(创建表后):{cursor.fetchall()}\n")
# 插入表数据
cursor.execute("insert into person(name, birthday) values('wen', '2001-09-23'), ('xiaoba', '1998-04-17');")
conn.commit() # 提交记录
# 查询表数据
cursor.execute("select * from person")
print(f"person插入数据后表内容为:{cursor.fetchall()}\n")
# 更新表数据
cursor.execute("update person set birthday='2001-12-17' where name='xiaoba';")
conn.commit()
cursor.execute("select * from person")
print(f"person更新数据后表内容为:{cursor.fetchall()}\n")
# 删除表数据
cursor.execute("delete from person where name='wen'")
conn.commit()
print(f"person删除数据后表内容为:{cursor.fetchall()}\n")
# 关闭连接
conn.close()
执行结果为:
当前test库的表有(创建表前):()
当前test库的表有(创建表后):(('person',),)
person插入数据后表内容为:((1, 'wen', datetime.date(2001, 9, 23)), (2, 'xiaoba', datetime.date(1998, 4, 17)))
person更新数据后表内容为:((1, 'wen', datetime.date(2001, 9, 23)), (2, 'xiaoba', datetime.date(2001, 12, 17)))
person删除数据后表内容为:()
游标对象提供了3种获取查询记录的方法
方法 | 描述 |
---|---|
fetchone() | 获取单条记录(元组形式) |
fetchmany(n) | 获取n条记录 (元组形式) |
fetchall() | 获取所有结果记录(元组形式) |
示例:
import pymysql
# 建立连接
conn = pymysql.connect(host="localhost",
port=3306,
user="root",
password="wen",
database="test",
charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor() # 获取游标对象
cursor.execute("select * from person where birthday>='2000-01-01'")
result_one = cursor.fetchone()
print(type(result_one))
print(f"fetchone()查询到的内容:{result_one}\n")
cursor.execute("select * from person where birthday>='2000-01-01'")
result_3 = cursor.fetchmany(3)
print(type(result_3))
print(f"fetchmany(3)查询到的内容:{result_3}\n")
cursor.execute("select * from person where birthday>='2000-01-01'")
result_all = cursor.fetchall()
print(type(result_all))
print(f"fetchall()查询到的内容:{result_all}")
# 关闭连接
conn.close()
执行结果为:
fetchone()查询到的内容:(1, 'wen', datetime.date(2001, 9, 23))
fetchmany(3)查询到的内容:((1, 'wen', datetime.date(2001, 9, 23)), (3, '张三', datetime.date(2012, 7, 9)), (5, 'harry', datetime.date(2013, 7, 9)))
fetchall()查询到的内容:((1, 'wen', datetime.date(2001, 9, 23)), (3, '张三', datetime.date(2012, 7, 9)), (5, 'harry', datetime.date(2013, 7, 9)), (6, 'heng李', datetime.date(2004, 11, 26)))
在增加、修改、删除表数据的时候,并不是说实时更新数据库的,当前连接对数据库的操作,要么全做,要么全不做。
pymysql提供了commit()和rollback()这2个方法
功能 | 描述 |
---|---|
commit() | 将游标的所有更新操作进行提交 |
rollback() | 回滚当前游标的所有操作 |
以下是没有执行commit()方法的示例:
import pymysql
# 建立连接
conn = pymysql.connect(host="localhost",
port=3306,
user="root",
password="wen",
database="test",
charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor() # 获取游标对象
# 插入表数据
cursor.execute("insert into person(name, birthday) values('harry', '2004-11-23'), ('heng李', '1983-04-28');")
# 更新表数据
cursor.execute("update person set birthday='2001-12-17' where name='xiaoba';")
# 删除表数据
cursor.execute("delete from person where name='wen'")
# 查询表数据
cursor.execute("select * from person")
print(f"person表内容为:{cursor.fetchall()}\n")
# 关闭连接
conn.close()
控制台打印结果为:
person表内容为:((2, 'xiaoba', datetime.date(2001, 12, 17)), (3, '张三', datetime.date(2012, 7, 9)), (9, 'harry', datetime.date(2004, 11, 23)), (10, 'heng李', datetime.date(1983, 4, 28)))
test数据库的person表在脚本执行前后如图:
我们看到,在该没有进行commit的脚本中,控制台打印的数据是更新后的数据,但是实际去mysql服务器查询的时候,脚本执行前后,数据并没有变化,可以判断出:游标对象对表数据的修改并没有在表中实际生效。
使用了commit()方法
import pymysql
# 建立连接
conn = pymysql.connect(host="localhost",
port=3306,
user="root",
password="wen",
database="test",
charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor() # 获取游标对象
# 插入表数据
cursor.execute("insert into person(name, birthday) values('harry', '2004-11-23'), ('heng李', '1983-04-28');")
# 更新表数据
cursor.execute("update person set birthday='2001-12-17' where name='xiaoba';")
# 删除表数据
cursor.execute("delete from person where name='wen'")
# 将修改内容提交到数据库
conn.commit()
# 查询表数据
cursor.execute("select * from person")
print(f"person表内容为:{cursor.fetchall()}\n")
# 关闭连接
conn.close()
执行后:
控制台打印内容为:
person表内容为:((2, 'xiaoba', datetime.date(2001, 12, 17)), (3, '张三', datetime.date(2012, 7, 9)), (11, 'harry', datetime.date(2004, 11, 23)), (12, 'heng李', datetime.date(1983, 4, 28)))
mysql查询:
对比未使用commit()的场景,mysql查询person表的时候,person表内容更新了
rollback()方法一般是用于执行表操作错误后,对已更新的内容进行回滚(如果已经commit()成功的内容,就不回滚,一般来说服,数据库操作均使用try-catch-finally去兼容异常
import pymysql
try:
# 建立连接
conn = pymysql.connect(host="localhost",
port=3306,
user="root",
password="wen",
database="test",
charset="utf8mb4")
# 执行操作(先获取游标对象,再执行sql语句)
cursor = conn.cursor() # 获取游标对象
# 更新表数据
cursor.execute("update person set birthdaye='2001-12-17' where name='张三';")
# 提交修改
conn.commit()
except Exception as e:
# 回滚事务
print(e)
print("即将对数据进行回滚")
conn.rollback()
finally:
# 关闭连接
conn.close()
执行结果为:
(1054, "Unknown column 'birthdaye' in 'field list'")
即将对数据进行回滚