我正在考虑将 sql 代码引入 python 对象,并使用数据模型提供的更多特殊方法。这是我的想法。你有什么意见?你会怎么做?
让我们定义一些表
table users
id: int
username: string
group_id: int
table groups
id: int
name: string
table values:
id: int
value_type_id: int
value: string
user_id: int
table value_types:
id: int
name: int
假设我们在 python 中有适当的类,名为 User、Group、Value、ValueType。
要获取特定用户的所有值,我会写:
values = Value.db
values.user.id == request["user_id"]
或者如果没有指定外键
values.user_id == request["user_id"]
要从数据库中获取值,我会像其他人一样进行迭代:
for value in values:
-> select * from values where user_id = ?
如果我不想要所有列,我会在迭代之前指定列,可能是这样的:
for value in values >> (values.value_type_id):
-> select value_type_id from values where user_id = ?"
但也许上面的阵型太过分了,太复杂了。也许我应该使用更简单的东西,例如:
for value in values.fields(values.value_type_id):
-> select value_type_id from values where user_id = ?"
如果我们想获得 ValueType 对象以及所有返回的值,我会做这样的事情:
values_types = Values.db
for (value_type, value) in (value_types + values):
-> select * from value_types join values ...
要添加没有外键的连接,我需要单独指定连接条件,像这样
groups = Group.db
values.user.group_id == groups.id
for (value, group) in (values + groups):
-> select users.*,groups.* from values join users join groups
比较部分很简单。我们可以轻松地模拟 <、<=、>、>=、==、in。所有这些比较函数都会改变 db manager sql 条件。
对于分组,我正在考虑使用这样的除法。你会用什么?
for value in values.fields(values.value_type_id) / values.value_type_id:
-> select value_type_id from values groupd by value_type_id
对于左连接,我会使用 +=。
for (value, group) in (values += groups):
-> select users.*,groups.* from values join users left join groups
我现在在想的是如何实现排序、拥有和区分。还不知道。也许你能帮忙?
嗯,这些是我最初的原始想法。欢迎您的想法。你会怎么做?你将做点什么不同的?