制作一个函数来抽象 web2py 数据库调用

Making a function to abstract a web2py DB call

我正在使用带有 DAL 的 web2py。我想做一个函数(出于代码可读性、从 web2py 抽象等多种原因……),它将在数据库上执行 select。例如:

def get_element_from_id(id, *options):
  return db(db.element.id == id).select(options)

功能很基础,但是用不上。如果我不提供选项(只是调用 get_element_from_id(1)),我有一个很棒的:

AttributeError: 'tuple' object has no attribute 'type'

如果我提供一个选项(例如 get_element_from_id(1, db.element.id)),我会得到:

AttributeError: 'NoneType' object has no attribute 'startswith'

有什么想法吗?提前致谢!

函数中,options会是一个列表,但是.select()不带列表,所以必须用*表示法将列表展开成一组参数:

.select(*options)

此外,为了使函数更通用,您可能还希望允许 .select() 方法的关键字参数——因此:

def get_element_from_id(id, *args, **kwargs):
    return db(db.element.id == id).select(*args, **kwargs)

另外请注意,如果您只想根据 ID 检索整个记录,DAL 已经允许您这样做:

db.element(id)