注意,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)

查询相对来说比较复杂,需要一些类来辅助。

首先有三个方法:

def select_one(self, extra=None, **kwargs):
    pass

def select_many(self, limit: Limit = None, extra=None, **kwargs) -> list:
    pass

def select_like(self,
                likes: Union[list[Like], Like] = {},
                limit: Limit = None,
                extra=None) -> list:
    pass
  • select_one 查询单个对象。
  • select_many 查询多个对象,把结果集中的内容以 list 的形式返回。
  • select_like 模糊查询,总是以 list 的形式返回。

为了方便演示,在 pypadb 使用文档 #2 的表和实体类的基础上新增如下表和实体类:

create table stuff
(
    test_id bigint       not null,
    name    varchar(20)  null,
    count   int unsigned null
);
# 新增 Stuff 类对应 stuff 表
class Stuff(BaseModel):
    test_id: int
    name: str
    count: int

# 修改 Test,新增 stuffs 属性
class Test(BaseModel):
    id: Optional[int]
    content: str
    stuffs: Optional[list[Stuff]]
    ctime: Optional[int]
    mtime: Optional[int]

test 表里的 id 属性对应 stuff 表里的 test_id,在查询 test 表时应该把对应的 Stuff 对象都查出来。

初始化

from pypadb.conf.table_configurer import tables

tables.init_tables(stuff=Stuff, test=Test)

select_one

# 不带任何参数,返回表中的第一条数据(应该没人用这个)
tables.test.select_one()

# 使用 extra
from pypadb.utils.conditions import extra

tables.test.select_one(
    id=1,
    extra=extra(column=['id', 'test_id'],
                data_property='stuffs',
                method=tables.stuff.select_many)
)

# 传入查询条件
tables.tset.select_one(id=1)

参数 extra 比较特殊,它接受 pypadb.utils.conditions.extra 函数返回的值并进行对应的处理。

pypadb.utils.conditions.extra 函数接受三个参数 columndata_propertymethod

  • column:一个长度为 2 的数组,值为 [当前调用表的列名, 需要额外查询的表的列名]。当前表和额外表是一对多的关系。
  • data_property:需要填充的属性名。
  • method:查询的方法。

select_one 在处理 extra 的时候会调用查询的方法,自动填充当前表查询出来的属性。

如上面的示例代码,把所有 stuff 表里 test_id 为 1 的数据全查出来填充到结果里的 stuffs 属性里。

select_many

from pypadb.utils.conditions import Limit

tables.test.select_many(limit=Limit(0, 1))

select_many 只是比 select_one 多一个可选参数 limit

顾名思义,limit 是用来做查询分页的,Limit(start, count) 会解析成 limit %(start)s, %(count)s,其中 count 为可选参数,若不传 count 则会解析成 limit %(start)s

select_like

from pypadb.utils.conditions import Like
from pypadb.utils.enums import LikeEnum

tables.test.select_like(likes=Like('content', '1', LikeEnum.ALL_Like))

select_like 相比 select_many,多了一个参数 likes,接受的值可以为 Likelist[Like]。若以 list[Like] 的形式传参,则模糊查询之间以 or 相连,即所有的模糊匹配都会生效。

Like(column, value, like_type) 需要指定模糊查询的列名,并传一个模糊查询的值。会根据 like_type 来解析左右模糊匹配或者全模糊匹配。