9.3 使用数据集

获取数据项的操作返回一个游标,该游标可用于从结果集中使用这些数据项。可以使用 Collection.find()Table.select()Session.sql() 从数据库读取数据项。Collection.find() 返回包含文档的数据集,而 Table.select()Session.sql() 分别返回包含行的结果集。

所有结果集都实现了一种统一的方式来迭代其数据项。统一的语法支持使用 fetchOne() 一次获取一项,或使用 fetchAll() 检索所有项的列表。fetchOne()fetchAll() 遵循仅向前迭代语义。实现 X DevAPI 的连接器可以在顶部提供更高级的迭代模式,以匹配常见的原生语言模式。

以下示例演示如何使用 fetchOne() 循环遍历所有文档,从而访问 Collection.find() 操作返回的文档。

fetchOne() 的第一次调用返回找到的第一个文档。所有后续调用都将内部数据项迭代器游标递增一个位置,并返回找到的项,从而使对 fetchOne() 的第二次调用返回找到的第二个文档(如果有)。当读取最后一个数据项并再次调用 fetchOne() 时,将返回 NULL 值。这确保了显示的基本 while 循环适用于支持此类实现的所有语言。

使用 fetchOne() 时,无法将内部数据项游标重置为第一个数据项以再次开始读取数据项。连接器可以丢弃已使用 fetchOne() 获取过一次的数据项(此处为文档)。数据项的生命周期与数据集分离。从连接器的角度来看,项目在被获取时由调用者使用。此示例假设测试模式存在。

myColl = db.get_collection('my_collection')

res = myColl.find('name like :name').bind('name','L%').execute()

doc = res.fetch_one()
while doc:
        print(doc)
        doc = res.fetch_one()

以下示例演示如何直接访问 Table.select() 操作返回的行。结果迭代的基本代码模式相同。以下示例与前一个示例之间的区别在于数据项处理。在这里,fetchOne() 返回行。访问行的列值的精确语法取决于语言。实现试图提供一种语言原生的访问模式。该示例假设 test 模式存在,并且员工表存在于 myTable 中。

myRows = myTable.select(['name', 'age']).where('name like :name').bind('name','L%').execute()

row = myRows.fetch_one()
while row:
        # Accessing the fields by array
        print('Name: %s\n' % row[0])
        # Accessing the fields by dynamic attribute
        print('Age: %s\n' % row.age)
        row = myRows.fetch_one()