python 数据库编程,这篇是针对 mysql 的,滚雪球学Python第4季第13篇

在第一季滚雪球学 python 中,我们已经接触了 python 操作 sqlite,本篇博客为你介绍 python 与 mysql 和 nosql 之间的故事。

在正式学习之前,先确保你电脑上已经安装了 mysql 。

mysql 的安装博客:补充知识:2021 年 mysql 最新 windows 安装教程,滚雪球学 python 第四季

mysql 一些简单命令

对于 mysql 的细致学习,咱们应该单独开一个系列,这个 flag 先立下了,本文为了学习 python 操作 mysql 数据库,只能先做一些基本铺垫。

查看所有数据库

show databases;

查看帮助

help

退出 mysql

exit

创建数据库

create database cadb;

删除数据库

drop database cadb;

使用某个数据库

use cadb;

查看库表

show tables;

查看表结构

desc 表名;

除了上述内容外,你还要学习建表语句,删表语句,表中插入数据语句,表删除数据语句,表更新数据语句,这些稍后在 python 操作 mysql 中进行实现。

python 操作 mysql

操作数据库一般被程序员成为 CRUD 操作(增删改查),其中各个字符分别代表 C(Create) 新增,R(Read) 读取,U(Update) 更新,D(Delete) 删除。

在 python3 中推荐使用 pymysql 模块操作数据库,模块使用命令 pip install PyMySQL 进行安装。

在此之前,先通过 MySQL Command Line Client 创建一个表用来做测试。

新建库,新建表,插入数据 命令依次如下

show databases;
create database cadb;
use cadb;
-- 建表语句
create table user(name varchar(10),uid int,primary key(uid));

desc user;

接下来在表中插入 2 条数据。

insert into user(name,uid) values ("橡皮擦",1);
insert into user(name,uid) values ("CSDN",2);

简单的查询 sql 如下所示:

select * from user;

下面就可以在 python 中编写操作该库表的相关代码了,数据库链接步骤如下:

  1. 连接数据库,生成连接对象;
  2. 创建游标对象,用于访问数据表;
  3. 执行 sql 语句;
  4. 关闭游标;
  5. 关闭连接。

python 查询数据
python 连接数据库获取数据

import pymysql

# python 连接数据库,返回数据库连接对象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
print(conn)

输出连接对象如下所示:

<pymysql.connections.Connection object at 0x00000000021E2F60>

其中 connect 方法相关的参数可以依据名称进行判断。

接下来就是创建游标,提取数据。

# 通过 cursor() 创建游标对象,并让查询结果以字典格式输出
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 输出 <pymysql.cursors.DictCursor object at 0x0000000002C03B00>

下一步使用游标对象 curexecute 方法执行 sql

cur.execute("select * from user")

最后通过相关方法获取查询结果,本案例获取所有用户使用 fetchall 方法。

# 获取查询结果
data = cur.fetchall()

输入数据库检索的所有数据。

[{'name': '橡皮擦', 'uid': 1}, {'name': 'CSDN', 'uid': 2}]

关闭游标,关闭连接

# 关闭游标
cur.close()
# 关闭数据库连接
conn.close()

接下来我们将其修改的复杂一些,检索特定数据,例如 uid=1 的数据,并且用到上下文管理器 with 进行对象的关闭。

第一种写法

import pymysql

# python 连接数据库,返回数据库连接对象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    cur.execute("select * from user where uid = %s", 1)
    # 获取查询结果
    data = cur.fetchall()
    print(data)

# 关闭数据库连接
conn.close()

第二种写法

import pymysql

# python 连接数据库,返回数据库连接对象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    cur.execute("select * from user where uid = %(uid)s", {"uid": 1})
    # 获取查询结果
    data = cur.fetchall()
    print(data)

# 关闭数据库连接
conn.close()

两种写法,在 execute 方法参数存在差异,可直接对比学习。

python 更新数据表数据
接下来演示的是使用 python 去更新表数据,例如将 uid = 2name 列更新为 Code

import pymysql

# python 连接数据库,返回数据库连接对象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    try:
        cur.execute("update user set name =%s where uid = %s", ["Code", 2])

        conn.commit()  # 提交事务
    except Exception as e:
        print("数据更新异常", e)
        conn.rollback()  # 数据回滚

# 关闭数据库连接
conn.close()

上述代码核心为在执行 SQL 操作之后,需要使用事务处理,即 conn.commit 提交事务,确保当前修改生效,如果出现异常,还需要使用 conn.rollback 对提交事务进行回滚。

cursor. execute 可以返回受影响行数,可以直接通过该值判断是否修改成功。

本次代码还使用了 try-except 语句,对于 PyMySQL 模块内置的异常类,清单如下:

  • StandardError
    • Warning
    • Error
      • InterfaceError
      • DatabaseError
        • DataError
        • OperationalError
        • IntegrityError
        • ProgrammingError
        • NotSupportedError

python 新增数据表数据
接下来演示增加数据,本次插入数据都采用硬编码,如果想创建一个自动递增的表字段,需要继续研究 sql 相关写法。

import pymysql

# python 连接数据库,返回数据库连接对象
conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")
# print(conn)
with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur:
    try:
        affected = cur.execute("insert into user(name,uid) values (%s,%s)", ["Good", 3])

        conn.commit()  # 提交事务
        print("受影响行数", affected)
    except Exception as e:
        print("数据插入异常", e)
        conn.rollback()  # 数据回滚

# 关闭数据库连接
conn.close()

python 删除表格数据
核心代码如下所示:

affected = cur.execute("delete from user where uid = %s", [3])
conn.commit()  # 提交事务
print("受影响行数", affected)

写到这里,你可以自行完成一个 python 简单的数据库操作封装。

python 操作 nosql 之 dbm

mysql 数据关系型数据库,与之对应的就是非关系型数据库,例如 python 内置的 dbm(database manager )

第一个要学习的方法是 dbm.open,方法原型如下所示:

def open(file, flag='r', mode=0o666):

flag 参数:

  • r : 只读;
  • w : 只写;
  • n : 总是创建一个数据库,打开方式为读写;
  • c : 存在不创建,不存在则创建。

关闭数据库使用 dbm.close(),使用 with 语句之后,不需要手动释放资源。

with dbm.open(xxx) as db:
    pass

dbm 存储的形式类似 python 字典,以键值对形式存在。

import dbm

with dbm.open('example.db', 'n') as db:
    db['name'] = '橡皮擦' # 存储值
    db['age'] = '18' # values must be bytes or strings

读取值使用 db[key] 即可,如果没有 key 值,提示 KeyError 错误。

import dbm

with dbm.open('example.db', 'r') as db:
    ca = db["name"]
    age = db["age"]
    print(ca)

dbm 数据库保存的数据是字符串类型或者字节序列类型,读取到的值是字节序列类型,需要使用解码函数 decode 转换成字符串。

更多精彩

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容