mORMot2 获取数据集

这篇具有很好参考价值的文章主要介绍了mORMot2 获取数据集。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

mORMot2 获取数据集

其实在前面想学习mORMot1部分已经收集了很多关于CRUD的示例了,但感觉总是不通透,不能很好使用,一则mORMot函数命令规则比较不同寻常,另外确实示例太少,其实代码注释倒是讲了很多。


procedure FillPrepare(Table: TOrmTable; aCheckTableName: TOrmCheckTableName = ctnNoCheck); overload;

FillPrepare 程序是为了从 TOrmTable 结果中准备获取值。

  • 在准备之后,你可以调用 FillRow(1..Table.RowCount) 来获取任何一行的值。
  • 或者,你也可以使用以下循环来遍历所有行:
while Rec.FillOne do
  dosomethingwith(Rec);
  • 在这个过程中,指定的 TOrmTable 被存储在一个受保护的内部字段 fTable 中。
  • 如果你想获取表中的字段名,可以设置 aCheckTableName 参数。在匹配到当前记录之前,任何待处理的 'TableName.' 前缀都将被去除。

注意:这里的 dosomethingwith(Rec); 是一个占位符,代表你可以对每一行记录 Rec 执行某些操作。实际使用时,你需要将其替换为具体的业务逻辑代码。同时,Rec 应该是一个已经定义好的记录类型变量,用于存储从 TOrmTable 中获取的数据。

另外,TOrmCheckTableName 是一个枚举类型,ctnNoCheck 是它的一个值,表示不进行表名检查。如果你需要检查表名,可以传递其他相应的枚举值给 aCheckTableName 参数。



function FillPrepare(const aClient: IRestOrm; const aSqlWhere: RawUtf8 = ''; const FieldsCsv: RawUtf8 = ''; aCheckTableName: TOrmCheckTableName = ctnNoCheck): boolean; overload;

FillPrepare 函数用于从 SQL WHERE 语句中获取值。

  • 如果 SQL 请求成功,则返回 true,如果在 SQL 请求期间发生错误,则返回 false。
  • 准备完成后,你可以通过调用 FillRow(1..Table.RowCount) 来获取任何一行的值。
  • 或者,你也可以使用以下循环来遍历所有行:
while Rec.FillOne do
  dosomethingwith(Rec);
  • 函数会创建一个临时的 TOrmTable,并将其存储在一个受保护的内部字段 fTable 中。
  • 如果 aSqlWhere 留空(''),则会尽快检索所有行(例如,通过绕过外部数据库的 SQLite3 虚拟表模块)。
  • WHERE 子句应使用内联参数(如 'Name=:('Arnaud'):')以提高服务器速度。请注意,你可以像这样使用 FormatUtf8()
aRec.FillPrepare(Client, FormatUtf8('Salary>? AND Salary<?', [], [1000, 2000]));

或者直接使用带有 BoundsSqlWhere 参数数组的 FillPrepare() 方法的重载版本。

  • FieldsCsv 可用于指定必须检索哪些字段。
  • 默认的 FieldsCsv='' 将检索所有简单的表字段,但如果你只需要访问一个或多个字段,并希望节省远程带宽,可以通过指定所需字段来实现。
  • 如果 FieldsCsv='*',它将检索所有字段,包括 BLOBs。
  • 请注意,如果你想稍后更新检索到的记录内容,则不应使用此可选的 FieldsCsv 参数,因为任何缺失的字段都将保留先前的值。但是,在 FillPrepare 之后可以安全地使用 BatchUpdate()(将仅设置 ID、TModTime 和映射的字段)。

function FillPrepare(const aClient: IRestOrm; const FormatSqlWhere: RawUtf8; const BoundsSqlWhere: array of const; const FieldsCsv: RawUtf8 = ''): boolean; overload;

使用带有 '%' 参数的指定 WHERE 子句准备获取值。

  • 如果 SQL 请求成功,则返回 true,如果在 SQL 请求期间发生错误,则返回 false。
  • 准备完成后,你可以通过调用 FillRow(1..Table.RowCount) 来获取任何一行的值。
  • 或者,你也可以使用以下循环来遍历所有行:
while Rec.FillOne do
  dosomethingwith(Rec);
  • 函数会创建一个临时的 TOrmTable,并将其存储在一个受保护的内部字段 fTable 中。
  • 为了提高服务器速度,WHERE 子句应使用在 FormatSqlWhere 语句中标识为 '?' 的绑定参数,这些参数应按照 BoundsSqlWhere 开放数组中提供的值的顺序进行排列。对于 TDateTime 类型,使用 DateToSql/DateTimeToSql,或者直接将任何整数/双精度/货币/RawUtf8 值绑定为请求的参数。
  • 请注意,此方法原型在框架的 1.17 版中已更改:以前 ParamsSqlWherearray of const 类型,并在 FormatSqlWhere 语句中使用 '%',而现在它期望绑定参数为 '?'。
  • FieldsCsv 可用于指定必须检索哪些字段。
  • 默认的 FieldsCsv='' 将检索所有简单的表字段,但如果你只需要访问一个或多个字段,并希望节省远程带宽,可以通过指定所需字段来实现。
  • 如果 FieldsCsv='*',它将检索所有字段,包括 BLOBs。
  • 请注意,如果你想稍后更新检索到的记录内容,则不应使用此可选的 FieldsCsv 参数,因为任何缺失的字段都将保留先前的值。但是,在 FillPrepare 之后可以安全地使用 BatchUpdate()(将仅设置 ID、TModTime 和映射的字段)。

function FillPrepare(const aClient: IRestOrm; const FormatSqlWhere: RawUtf8; const ParamsSqlWhere, BoundsSqlWhere: array of const; const FieldsCsv: RawUtf8 = ''): boolean; overload;

使用带有 '%' 和 '?' 参数的指定 WHERE 子句准备获取值。

  • 如果 SQL 请求成功,则返回 true,如果在 SQL 请求期间发生错误,则返回 false。
  • 准备完成后,你可以通过调用 FillRow(1..Table.RowCount) 来获取任何一行的值。
  • 或者,你也可以使用以下循环来遍历所有行:
while Rec.FillOne do
  dosomethingwith(Rec);
  • 函数会创建一个临时的 TOrmTable,并将其存储在一个受保护的内部字段 fTable 中。
  • FormatSqlWhere 子句会将所有 '%' 字符替换为提供的 ParamsSqlWhere[] 数组中的值,并将所有 '?' 字符绑定为 BoundsSqlWhere[] 数组中的绑定参数值。
  • FieldsCsv 可用于指定必须检索哪些字段。
  • 默认的 FieldsCsv='' 将检索所有简单的表字段,但如果你只需要访问一个或多个字段,并希望节省远程带宽,可以通过指定所需字段来实现。
  • 如果 FieldsCsv='*',它将检索所有字段,包括 BLOBs。
  • 请注意,如果你想稍后更新检索到的记录内容,则不应使用此可选的 FieldsCsv 参数,因为任何缺失的字段都将保留先前的值。但是,在 FillPrepare 之后可以安全地使用 BatchUpdate()(将仅设置 ID、TModTime 和映射的字段)。

这个函数结合了两种参数替换方式:'%' 字符的直接替换和 '?' 的绑定参数方式,为用户提供了更大的灵活性。但同时,也要求用户更仔细地管理参数以避免潜在的 SQL 注入风险。


function FillPrepare(const aClient: IRestOrm; const aIDs: array of TID; const FieldsCsv: RawUtf8 = ''): boolean; overload;

准备从一个ID列表中获取值。

  • 如果SQL请求成功,则返回true,如果SQL请求期间出现错误,则返回false。
  • 准备完成后,你可以通过调用 FillRow(1..Table.RowCount)来获取任何一行的值。
  • 或者,你也可以使用以下循环来遍历所有行:
while Rec.FillOne do
  dosomethingwith(Rec);
  • 函数会创建一个临时的 TOrmTable,并将其存储在一个受保护的内部字段 fTable中。
  • FieldsCsv可用于指定必须检索哪些字段。
  • 默认的 FieldsCsv=''将检索所有简单的表字段,但如果你只需要访问一个或多个字段,并希望节省带宽,可以通过指定所需字段来实现。
  • 如果 FieldsCsv='*',它将检索所有字段,包括BLOBs。
  • 请注意,如果你想稍后更新检索到的记录内容,则不应使用此可选的 FieldsCsv参数,因为任何缺失的字段都将保留先前的值。但在 FillPrepare之后可以安全地使用 BatchUpdate()(只会设置ID、TModTime和映射的字段)。

这个重载版本的 FillPrepare函数接收一个ID数组作为参数,使得用户能够一次性检索多个特定ID对应的记录,提高了数据检索的效率。同时,与上一个版本类似,它也支持通过 FieldsCsv参数来定制需要检索的字段,以满足不同的数据需求。


function FillPrepareMany(const aClient: IRestOrm; const aFormatSQLJoin: RawUtf8; const aParamsSQLJoin, aBoundsSQLJoin: array of const): boolean;

准备遍历包含 TOrmMany字段的JOIN语句。

  • 所有 TOrmMany.Dest发布的字段现在将包含一个真正的 TOrm实例,准备好用JOIN语句的结果填充(这些实例将在 FillClose时释放)——Source也将指向自身实例。
  • aFormatSQLJoin子句将为自动化的JOIN语句定义一个WHERE子句,包括 TOrmMany发布的属性(及其嵌套属性)。
  • 如果SQL请求成功,则返回true,如果SQL请求期间出现错误,则返回false。
  • 一个典型的应用场景可能如下:
if aProd.FillPrepareMany(Database,
    'Owner=? and Categories.Dest.Name=? and (Sizes.Dest.Name=? or Sizes.Dest.Name=?)',
    [], ['mark', 'for boy', 'small', 'medium']) then
  while aProd.FillOne do
    // 在这里,例如,aProd.Categories.Dest被实例化(并且Categories.Source=aProd)
    writeln(aProd.Name, ' ', aProd.Owner, ' ', aProd.Categories.Dest.Name, ' ', aProd.Sizes.Dest.Name);
// 你也可以使用aProd.FillTable来填充一个网格,例如
// (不要忘记设置aProd.FillTable.OwnerMustFree := false)

这将执行类似于以下的JOIN SELECT语句:

select p.*, c.*, s.*
from Product p, Category c, Categories cc, Size s, Sizes ss

这个函数允许用户准备和执行复杂的JOIN查询,同时自动处理 TOrmMany关系。通过这种方式,用户可以方便地获取相关联的数据,并在应用程序中进行进一步处理。此函数还提供了参数化查询的功能,增强了查询的灵活性和安全性。文章来源地址https://www.toymoban.com/news/detail-857937.html

到了这里,关于mORMot2 获取数据集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】【排序】其实超级简单啦!

    本博客的所有代码都已测试完毕,请放心使用哟❤ 在文章的最后面会贴出全部的码源,各位行行好点个赞吧(小狗哭泣)QAQ 排序 :所谓排序,就是使一串记录,按照其中的某个的某个或者某些的大小,递增或递减的排序起来的操作。 内部排序 :数据元素全部放在内

    2024年04月11日
    浏览(38)
  • SpringCloud-Eureka【服务案例】,掌握数据库其实很容易

    3.修改启动类 在启动类的头部开启Eureka客户端的主键 4.添加配置信息 在application.properties中添加如下的信息 spring.application.name=eureka-provider server.port=9090 eureka.client.serviceUrl.defaultZone=http://eureka1:8761/eureka/,http://eureka2:8761/eureka/ 注意eureka1和eureka2我们需要在hosts文件中配置映射如下

    2024年04月16日
    浏览(37)
  • mORMot 1.18 第07章 简单的读写操作

    本章描述了典型的数据读写操作。首先,我们将注意力集中在数据上,而不是函数。 读取操作返回一个TID,它是一个32位或64位整数(取决于你的内存模型),反映了表的信息。TID在表中的每一行都是唯一的。 ORM的新手可能会感到惊讶,但通常你不需要创建SQL查询来过滤请求

    2024年04月28日
    浏览(48)
  • 入门编程其实也简单

    随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢? 编程是指使用计算机语言编写计算机程序的过程。计算机程序是一系列指令的集合,这些指令告诉计算机要执行的操作。编程的目的是创建计算机程序,以解决特定的问题或完成

    2024年02月08日
    浏览(49)
  • MySQL架构设计其实很简单

    我们很多互联网项目首选的数据库就是MySql5.7,因为免费,支持数据库主从复制,读写分离,且语法简单,容易上手,虽然对sql的函数、触发器、存储过程有一定的了解,也能说出一些优化sql语句的方法,但这些只能说是对MySql的浅薄了解。 在当今这个社会,竞争异常的激烈

    2023年04月23日
    浏览(39)
  • WiFi模块原理图其实不难看懂

    Wi-Fi模块的原理图包括一些关键部件,如收发器、无线局域网(WLAN)收发器、天线、微处理器、射频(RF)放大器、电源管理等。 收发器和WLAN收发器根据IEEE802.11标准实现Wi-Fi网络功能,包括接入点实现和终端设备实现,基于半双工技术,实现了接入点和终端设备之间的连接,

    2024年02月10日
    浏览(38)
  • 【AI&3D】nerf入门及其实操

    nerf的理论性介绍已经比较多了。 NERF的提出 Mildenhall, B., Xiao, J., Barron, J.T., Chen, R., Radford, A., and Ng, R. 2020. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. In European Conference on Computer Vision (ECCV) . 论文地址:[2003.08934] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    2024年02月08日
    浏览(38)
  • nginx http 499,其实没有很可怕

            499作为nginx自定义的状态码,不像400、401、500、502等常见的http状态码,很多不太常用nginx的人可能并不能清楚理解他的含义,本文将简单介绍一下499状态码的含义,以及出现后的排查和处理思路,以及proxy_ignore_client_abort参数是否能有效。         nginx 对499的定

    2024年02月03日
    浏览(39)
  • 如何成为名副其实的测试架构师?

    测试模型无处不在,你只有真正理解了“什么是测试架构”、拥有了测试建模能力,才能成为名副其实的测试架构师。 众所周知,“ 架构 (architecture)”一词来源于建筑,具有 “建筑学、体系结构” 等含义。建筑学的内涵要比体系结构丰富得多,但其核心往往关注其造型

    2023年04月08日
    浏览(48)
  • 跳槽进阿里了,其实也没那么难...

    对于很多没有学历优势的人来说,面试大厂是非常困难的,这对我而言,也是一样,出身于二本,原本以为就三点一线的生活度过一生,直到生活上的变故,才让我有了新的想法和目标,因此我这个二本渣渣也奋斗了起来,竟拿下了阿里测开岗。今天分享这波面经,主要是希

    2023年04月20日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包