写点什么

TiDB 6.0 Book Rush | TiDB 和 Python 的 CRUD 应用开发实践

  • 2022 年 7 月 11 日
  • 本文字数:2494 字

    阅读完需:约 8 分钟

作者: ShawnYan 原文来源:https://tidb.net/blog/ef4c1f65


本文将介绍如何使用 Python 对 TiDB 进行应用开发,并做简单的 CRUD 演示。对应 TiDB 6.0 Book Rush第二章


测试环境

为了便于演示应用开发,本文将使用 TiDB 6.0 本地测试集群,以及 MariaDB Connector/Python,具体环境版本信息如下。


TiDB 6.0

Python 3.6.8

MariaDB Connector/Python 1.0.11

部署本地测试集群

快速启动本地测试集群,具体方法请参考 官方文档–部署本地测试集群 和文章 《TiUP:TiDBAer 必备利器》


  • 本文使用的测试环境启动命令为:

  • 运行结果为:

Python 连接器

介绍几种常见的 Python 连接器

TiDB 高度兼容 MySQL 5.7 协议,理论上只要是支持 MySQL 及其分支版本的 Python 连接器都可以连接 TiDB,但仍需要具体测试。



除这两种官方连接器之外,还有两种常见的客户端,分别是:


  • Python 2 下使用的 MySQL-python,该包已停止维护,不推荐使用。

  • Python 3 下使用的 pyMySQL,该包持续更新,且遵从 MIT 协议,可放心使用。


本文使用的是 MariaDB Connector/Python,下面将做具体演示。

安装 Python 连接器

CentOS 7 环境

由于 MariaDB Connector/Python 使用 Python 3 编写,且依赖 MariaDB Connector/C,所以需要先安装依赖包。


  • 安装必要的依赖:

  • 安装完成后,检查已安装的包:

  • 通过 pip 安装连接器:

  • 运行结果为:

  • 安装步骤支持幂等性,二次执行命令结果如下:

  • 安装完成后,检查已安装的包:


到此,安装完成!

Windows 环境

与 CentOS 环境类似,需要安装 MariaDB Connector/C,下载页面为 Connectors


此外,还需要安装 Microsoft Visual C++ 14.0,下载页面为 Microsoft Visual C++ Build Tools


本文示例代码是在 PyCharm 中开发的,所以在安装完成依赖后,直接在 PyCharm 中安装 MariaDB Connector/Python。


安装路径为:File > Settings > Project > Available Packages



图 - 安装 mariadb 包


到此,安装完成!

CURD 实践

基础数据

通过 tiup demo 创建基础数据,会自动在 TiDB 中创建库 bookshop 以及 6 张表,并导入基础数据。


Bookshop 是一个虚拟的在线书店应用,你可以在 Bookshop 当中便捷地购买到各种类别的书,也可以对你看过的书进行点评。


  • 执行如下命令,生成基础数据:

  • 运行结果为:

  • 查看新建库 bookshop 表数据量:

  • 运行结果为:

使用 Python 连接器创建连接

需要配置连接信息,默认为不自动提交:


conn_params = {    "user": "root",    "password": "",    "host": "192.168.8.101",    "port": 4000,    "database": "bookshop",    "autocommit": False}
复制代码

检查基本连接信息

可调用连接器内置方法,直接查看数据库版本和会话的字符集。发送查询语句,查看自动提交的参数值。


  • 示例代码如下:

  • 运行结果如下:


注:使用 MariaDB Connector/Python 连接数据库,会总是使用 utf8mb4

单值写入

下面将分别从:单值写入、多值写入、单值查询,以及多值查询,四种情况做演示。


books 表中插入一条数据,并在之后手动提交:


# 4. Insert One RowsqlInsertOne = "REPLACE INTO books (id, title, published_at) VALUES (1, 'tidb-monthly', '2022-05-09')"cursor.execute(sqlInsertOne)conn.commit()
复制代码


如果 TiDB Server 已开启 General 日志,则可以在日志文件中看到:


[2022/05/12 22:26:05.103 +08:00] [INFO] [session.go:3264] [GENERAL_LOG] [conn=467] [user=root@%] [schemaVersion=144] [txnStartTS=0] [forUpdateTS=0] [isReadConsistency=false] [current_db=bookshop] [txn_mode=PESSIMISTIC] [sql="REPLACE INTO books (id, title, published_at) VALUES (1, 'tidb-monthly', '2022-05-09')"][2022/05/12 22:26:05.120 +08:00] [INFO] [session.go:3264] [GENERAL_LOG] [conn=467] [user=root@%] [schemaVersion=144] [txnStartTS=433157718689710084] [forUpdateTS=433157718689710084] [isReadConsistency=false] [current_db=bookshop] [txn_mode=PESSIMISTIC] [sql=COMMIT]
复制代码

多值写入

也可将多组值包装到一个字典中,然后传递给执行器,此时就用到了 executemany,可一次性执行多条语句,并将其封装在一个事务内,以保证写入数据的完整性。


  • 演示代码如下:

  • TiDB Server 的 General 日志打印如下:

单值读取

因为 TiDB 使用 utf8_bin 做为默认校验规则,所以查询条件会区分大小写,这里使用内置函数 lower() 将所有字符转成小写,来消除大小写区分的影响。


  • 使用 fetchone() 方法查询一条结果,并用 | 作为分隔符将结果打印。

  • 控制台打印结果为:

多值读取

对于多值读取的情况,可使用 fetchmany(size: int) 方法,传入欲获取的行数后执行,即可得到需要的结果集。本例中,因为上文只写入 4 条数据,所以也只能查到 4 条,代码如下。


# 7. Query Data -- Manycursor.execute("SELECT * FROM books where lower(title) like 'tidb%'")row = cursor.fetchmany(10)print("rows_affected:", cursor.rowcount)
res = []for i in row: res.append({"id": i[0], "book": i[1], "published": "{:%Y-%m-%d}".format(i[3])})print("Select Many Rows:", res)
复制代码


  • 控制台输出结果:

小结

到此,以上四种情况已全部演示完毕。


最后,以一个完整示例作为本文结尾。


  • 示例:查询 Books 表所在的 TiKV 节点的版本和地址,并输出结果。


输出结果为:


Server Version: 5.7.25-TiDB-v6.0.0Connection Charset: utf8mb4 utf8mb4_general_ciSelect Many Rows: [{'DB': 'bookshop', 'TABLE': 'books', 'REGION_ID': 4028065, 'TIKV_ADDR': '192.168.8.101:20161', 'TIKV_VERSION': '6.0.0'}]
复制代码


以上就是本文的全部内容,其他开发语言的开发实践,请参考官方文档,或扩展阅读。

扩展阅读


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiDB 6.0 Book Rush | TiDB 和 Python 的 CRUD 应用开发实践_6.x 实践_TiDB 社区干货传送门_InfoQ写作社区