注意,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
函数接受三个参数 column
、data_property
、method
。
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
,接受的值可以为 Like
或 list[Like]
。若以 list[Like]
的形式传参,则模糊查询之间以 or
相连,即所有的模糊匹配都会生效。
Like(column, value, like_type)
需要指定模糊查询的列名,并传一个模糊查询的值。会根据 like_type
来解析左右模糊匹配或者全模糊匹配。