Web2py公司SQLFORM.grid与executesq

2024-05-07 23:43:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个web2py应用程序,我在模型中定义了两个mysql表数据库文件:

db.define_table('table1',
    Field('id','integer'),
    Field('name','string'),
    migrate=False)

db.define_table('table2',
    Field('id','integer'),
    Field('name','string'),
    migrate=False)

我希望应用程序返回这些表的并集:

^{pr2}$

在一个SQLFORM.grid但显然

form=SQLFORM.grid(data, create=False, deletable=False, editable=False, maxtextlength=100, paginate=10)

不是该走的路。在

有人能帮帮我吗?这一定很简单,但我很难找到解决办法。在

谢谢你


Tags: name模型idfalse应用程序fielddbstring
1条回答
网友
1楼 · 发布于 2024-05-07 23:43:25

网格被设计为接受一个表或查询,因此不能传递Rows对象或任意SQL。最好的方法是在数据库中创建一个视图,并创建一个与该视图相关联的新的DAL模型定义(请确保设置migrate=False,因为您不希望DAL试图用视图的名称创建一个表)。然后可以将视图模型传递到栅格:

db.define_table('t1_t2_union_view',
    Field('id','integer'),
    Field('name','string'),
    migrate=False)

grid = SQLFORM.grid(db.t1_t2_union_view, ...)

上面的工作原理是因为web2py将把数据库视图的模型视为任何其他数据库表,发出一个查询来选择它的所有记录。在这种情况下,不需要executesql,因为表的联合由视图在数据库中处理。在

实际上,您可以将表定义简化为:

^{pr2}$

当您将一个现有表传递给.define_table()时,您将得到一个具有与原始表相同字段定义的新表,这正是我们想要的。在

如果为每个可能的联合创建单独的视图是不可行的,一种可能的替代方法是通过executesql检索数据,然后迭代记录,将每个记录插入内存中的SQLite数据库表中,然后将其传递给网格:

union_tables = ('table1', 'table2')
temp_db = DAL('sqlite:memory')
union_table = temp_db.define_table('union_table', db[union_tables[0]])

records = db.executesql(sql, as_dict=True)
for record in records:
    union_table.insert(**union_table._filter_fields(record))

grid = SQLFORM.grid(union_table, create=False, editable=False, deletable=False)

设置as_dict=True会返回一个字典列表,这使得插入更容易,因为字典的键是插入所需的字段名。在

注意,这个方法有点低效,所以您必须测试它,看看它在工作负载下的表现。在

相关问题 更多 >