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()

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0