async def check(data, records): for column, fkvalues_lst in data.items(): for fkvalues in fkvalues_lst: # got nothing, skip if not records: continue pks = [] all_ni = True for i in records: val = i.get(column, NotImplemented) if val != NotImplemented: all_ni = False pks.append(val) if all_ni: logger.debug( "load foreign key failed, do you have read permission to the column %r?" % column) continue # 3. query foreign keys vcls = self.app.tables[fkvalues['table']] v = vcls(self.app, self._request) # fake view await v._prepare() info2 = SQLQueryInfo() info2.set_select(ALL_COLUMNS) info2.add_condition(PRIMARY_KEY, SQL_OP.IN, pks) info2.bind(v) # ability = vcls.permission.request_role(self.current_user, fkvalues['role']) # info2.check_query_permission_full(self.current_user, fktable, ability) try: fk_records, count = await v._sql.select_page(info2, size=-1) except RecordNotFound: # 外键没有找到值,也许全部都是null,这很常见 continue if not fk_records: continue fk_records = list(fk_records) await v.check_records_permission(info2, fk_records) fk_dict = {} for i in fk_records: # 主键: 数据 fk_dict[i[vcls.primary_key]] = i column_to_set = fkvalues.get('as', column) or column for _, record in enumerate(records): k = record.get(column, NotImplemented) if k in fk_dict: record[column_to_set] = fk_dict[k] if fkvalues['loadfk']: await check(fkvalues['loadfk'], fk_records)
async def test_select(): assert SQLQueryInfo.parse_select('aa') == {'aa'} assert SQLQueryInfo.parse_select('aa,') == {'aa'} assert SQLQueryInfo.parse_select('aa,bbb') == {'aa', 'bbb'} assert SQLQueryInfo.parse_select('aa, bbb') == {'aa', 'bbb'} assert SQLQueryInfo.parse_select('aa, \nbbb') == {'aa', 'bbb'} assert SQLQueryInfo.parse_select('*') == ALL_COLUMNS try: SQLQueryInfo.parse_select(',') assert False except Exception as e: assert isinstance(e, InvalidParams) try: SQLQueryInfo.parse_select(',,,') assert False except Exception as e: assert isinstance(e, InvalidParams) sqi = SQLQueryInfo() try: sqi.set_select([1, 2, '3']) assert False except Exception as e: assert isinstance(e, AssertionError) try: sqi.set_select(None) assert False except Exception as e: assert isinstance(e, InvalidParams) assert sqi.set_select(ALL_COLUMNS) is None assert sqi.set_select(['1', '2', '3']) is None assert sqi.set_select({'1', '2', '3'}) is None