注意,pypadb 0.1.14 版本破坏性变更。

命名更改:
pypadb.conf.db_configurer    -> pypadb.conf.db    (module)
pypadb.conf.table_configurer -> pypadb.conf.table (module)

pypadb.conf.db.DbConfigurer   -> pypadb.conf.db.DbConfig       (class)
pypadb.conf.table.TableConfig -> pypadb.conf.table.TableConfig (class)

pypadb.conf.db.db_configurer -> pypadb.conf.db.db_config     (attribute)
pypadb.conf.table.tables     -> pypadb.conf.table.table_pool (attribute)

安装

pypadb 依赖于 DBUtils、pydandic、PyMySQL,建议使用虚拟环境,避免污染全局依赖。

pip install pypadb

数据库连接配置

数据库连接用的是 pymysql,使用 DBUtils 作为连接池。

pypadb.conf.db_configurer 里有一堆 setter,是用来做数据库连接池配置的。

由于篇幅原因就不写方法具体内容了,返回的是 self,所以支持链式调用的写法。

方法 配置项 默认值
set_creator 配置连接数据库的模块 pymysql
set_maxconnections 连接池允许的最大连接数,0 和 None 表示不限制连接数 6
set_mincached 初始化时,链接池中至少创建的空闲的链接,0 表示不创建 2
set_maxcached 链接池中最多闲置的链接,0和None不限制 5
set_blocking 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 True
set_maxusage 一个链接最多被重复使用的次数,None表示无限制 None
set_setsession 开始会话前执行的命令列表 []
set_host 数据库服务端主机名 127.0.0.1
set_port 数据库服务端端口号 3306
set_user 数据库登录用户 root
set_password 数据库登录密码 123456
set_database 数据库名 test
set_charset 数据库连接使用的字符编码 utf8
set_cursor 数据库查询使用的指针类型 pymysql.cursors.DictCursor

使用 DictCursor 作为默认指针的原因是 DictCursor 会把每一行的查询结果作为 dict 返回 {'列名':'数据'},表结构改变时需要改动的代码少很多。

配置完后要调用 end 方法,初始化连接池。

完整的配置如下:

from pypadb.conf.db_configurer import db_configurer, DbConfigurer

db_configurer \
    .set_host('localhost') \
    .set_user('root') \
    .set_password('123456') \
    .set_database('test') \
    .end()

# 或者自己 new 一个对象
DbConfigurer() \
    .set_host('localhost') \
    .set_user('root') \
    .set_password('123456') \
    .set_database('test') \
    .end()

数据表配置(仅对象数据映射部分会用到)

from pydantic import BaseModel
from pypadb.conf.table_configurer import tables


class User(BaseModel):
    id: int
    account: str
    stuffs: list = []

# 实体类必须继承 pydantic 的 BaseModel
class Stuff(BaseModel):
    user_id: int
    name: str
    count: int

# 真正的配置部分 表名=类名
tables.init_tables(user=User, stuff=Stuff)
# 使用表格配置的内容
tables.user.select_one()
tables.stuff.select_many()

使用数据表就不需要另外写什么类或者模块,表和类的映射配好后直接把表作为 tables 的属性进行调用。

2022-01-26