Python 中数据库编程,主要是通过使用数据库的三方模块来操作数据库的增删改查,通常使用 PyMYSQL 模块。
PyMYSQL 是 python 中操作 MySQL 的模块,使用方法和 MySQLdb 几乎相同。但目前 PyMYSQL 仅支持 py3,而 MySQLdb 不支持 py3。PyMYSQL 是三方模块,所以需要单独进行安装。
pip3 install pymysql
找一台虚拟机或者本地装一个数据库,用作测试使用,我这里使用虚拟机,通过 docker 启动一个mysql 5.7.30。
docker run -p 3306:3306 --name pymysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.30
登录到 mysql,创建一个数据库,用于代码连接数据库进行操作。
$ docker exec -it pymysql bash
$ mysql -uroot -p123456
mysql> create database test;
mysql> use test;
mysql> create table user(
id int primary key not null auto_increment,
username varchar(50) not null,
password varchar(50) not null
);
插入数据
使用 pymysql 给数据库插入一条数据
import pymysql
conn = pymysql.connect(host='192.168.1.10', # 数据库地址
port=3306, # 数据库端口
user='root', # 登录数据库用户
password='123456', # 用户密码
db='test', # 要操作的数据库名
charset='utf8', # 字符集
cursorclass=pymysql.cursors.DictCursor) # 返回结果的格式指定为字典格式,不指定则为元组
cursor = conn.cursor() # 开启游标功能
sql = "insert into user(username, password) values('FeiYi', '151xxxx4237pjf')" # 要执行的sql语句
cursor.execute(sql) # 将sql放到游标中执行
conn.commit() # 提交事务
以上提到的游标概念,我是模糊的,查了下大概明白了,可参考:https://cloud.tencent.com/developer/article/1575066
查询数据
接着再查询一下刚才插入的数据
import pymysql
conn = pymysql.connect(host='192.168.1.10',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()
sql = "insert into user(username, password) values('FeiYi', '151xxxx4237pjf')"
cursor.execute(
"select * from user"
)
conn.commit()
select_res = cursor.fetchall() # fetchall返回全部结果,fetchone返回第一条结果,fetchmany(n)返回前n条结果
print(select_res)
# 返回结果
[{'id': 2, 'username': 'FeiYi', 'password': '151xxxx4237pjf'}]
其余增删改查只要对 sql 语句了解,对 sql 语句做修改即可。
插入多条数据
如上的例子中只是在执行单条 sql,执行多条可以使用 executemany()
。这个方法的特点是执行相似语句,比如给同一个 table 插入批量数据的时候,insert 语句只有数据是不一样的,这样的可以使用 executemany()
方法
import pymysql
conn = pymysql.connect(host='192.168.1.10',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
cursor = conn.cursor()
sql = "insert into user(username, password) values(%s, %s);"
data = [('MuPei', '151xxxx3914cyj'), ('CiMu', '151xxxx4237Pjf'), ('TianCi', '151xxxx3914Cyj')]
cursor.executemany(sql, data)
conn.commit()
cursor.execute("select * from user")
conn.commit()
select_res = cursor.fetchmany(3)
print(select_res)
关闭连接
以上的操作中都没有关闭连接的操作,这样会导致数据库中的连接数不会释放,本身所有需要创建连接的操作都有 close()
方法的,为了代码简洁和高效,可以使用前面学到过的 with...
去自动关闭连接。
import pymysql
conn = pymysql.connect(host='192.168.1.10',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
with conn.cursor() as cursor:
cursor.execute("select * from user")
conn.commit()
select_res = cursor.fetchall()
for dict in select_res:
print(f"ID: {dict['id']}, 用户名: {dict['username']}, 密码: {dict['password']}")
# 输出结果
ID: 2, 用户名: FeiYi, 密码: 151xxxx4237pjf
ID: 3, 用户名: MuPei, 密码: 151xxxx3914cyj
ID: 4, 用户名: CiMu, 密码: 151xxxx4237Pjf
ID: 5, 用户名: TianCi, 密码: 151xxxx3914Cyj
为了代码的完整运行,还可以加入 try...
来捕获异常或者抛出报错。
import pymysql
conn = pymysql.connect(host='192.168.1.10',
port=3306,
user='root',
password='123456',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
try:
with conn.cursor() as cursor:
cursor.execute("select * from user")
conn.commit()
select_res = cursor.fetchall()
for dict in select_res:
print(f"ID: {dict['id']}, 用户名: {dict['username']}, 密码: {dict['password']}")
finally:
conn.close()