mORMot模糊概念--FormatSQL-第1部分

海利鸟 2024-07-07 08:09:00 阅读 58

mORMot里面的模糊概念--FormatSQL第1部分

mORMot 的 Fast Format 到底是% 还是 ? 作为参数!,先看看关键代码。

下面是代码原始注释

<code>function FormatSql(const Format: RawUtf8; const Args, Params: array of const): RawUtf8;

fast Format() function replacement, handling % but also ? inlined parameters

  • will include Args[] for every % in Format
  • will include Params[] for every ? in Format, as "inlined" ORM or DB values,

    e.g. :(1234): for numbers, and 😦'quoted '' string'): for text

  • note that, due to a Delphi compiler limitation, cardinal values should be

    type-casted to Int64() (otherwise the integer mapped value will be converted)

  • is a wrapper around FormatParams(Format, Args, Params, false, result);

快速Format()函数替代,处理%和?内联参数

  • Format中每个%都将包含Args[]
  • Format中每个?都将包含Params[],作为“内联”ORM或DB值,

    例如,数字用:(1234):表示,文本用:('quoted '' string'):表示

  • 请注意,由于Delphi编译器的限制,基数值应转换为Int64()(否则映射的整数值将被转换)
  • 是FormatParams(Format, Args, Params, false, result)的包装函数;

注:

  1. “Args[] for every % in Format” 指的是,在Format字符串中,每一个百分号(%)都将对应一个Args数组中的元素,用于替换该百分号。
  2. “Params[] for every ? in Format” 指的是,在Format字符串中,每一个问号(?)都将对应一个Params数组中的元素,这个元素可能是一个ORM(对象关系映射)值或者数据库值。
  3. “cardinal values should be type-casted to Int64()” 指的是,由于Delphi编译器的某些限制,需要将基数值(无符号整数值)显式转换为Int64类型,以避免整数值的自动转换可能引发的问题。
  4. “wrapper around FormatParams” 指的是,这个函数实质上是对另一个函数FormatParams的封装,使得调用更加简便,或者增加了额外的功能。

function FormatJson(const Format: RawUtf8; const Args, Params: array of const): RawUtf8;

fast Format() function replacement, handling % but also ? parameters as JSON

  • will include Args[] for every % in Format
  • will include Params[] for every ? in Format, as their JSON value, with

    proper JSON double quotes and escaping for strings

  • note that, due to a Delphi compiler limitation, cardinal values should be

    type-casted to Int64() (otherwise the integer mapped value will be converted)

  • is a wrapper around FormatParams(Format, Args, Params, true, result);

快速Format()函数的替代品,处理%同时也处理?参数作为JSON

  • 将为每个在Format中出现的%包含Args[]
  • 将为每个在Format中出现的?包含Params[],作为它们的JSON值,字符串会使用适当的JSON双引号和转义字符
  • 注意,由于Delphi编译器的限制,基数值应该被类型转换为Int64()(否则映射的整数值将被转换)
  • 是FormatParams(Format, Args, Params, true, result)的包装函数;

{$ifndef PUREMORMOT2}

// rather call FormatSql() and FormatJson() functions

// 更应该调用 FormatSql() and FormatJson() 使代码清晰

function FormatUtf8(const Format: RawUtf8; const Args, Params: array of const; JsonFormat: boolean = false): RawUtf8; overload;

{$endif PUREMORMOT2}

fast Format() function replacement, handling % and ? parameters

  • call rather FormatSql() and FormatJson() wrappers instead
  • resulting string has no length limit and uses fast concatenation
  • any supplied TObject instance will be written as their class name

快速Format()函数替代,处理%和?参数

  • 请改用FormatSql()和FormatJson()包装函数
  • 生成的字符串没有长度限制,并使用快速连接
  • 任何提供的TObject实例都将以其类名写入

从下面两段示例可以看出他们的区别

procedure TForm1.Button1Click(Sender :TObject);

var

SearchPhrase :RawUtf8;

begin //sql 文字替换

SearchPhrase:='abcde' ;

Edit2.Caption := mormot.core.json.FormatUtf8(' % MATCH ? ORDER BY rank DESC ', ['SearchTable'], [SearchPhrase]); SearchPhrase:='abcde' ;

Edit1.Caption := mormot.core.json.FormatUtf8(' % MATCH ? ORDER BY rank DESC ', ['SearchTable'], [123]);

end;

procedure TForm1.Button2Click(Sender :TObject);

var

SearchPhrase :RawUtf8;

begin //json 文字替换

SearchPhrase:='abcde' ;

Edit2.Caption := mormot.core.json.FormatUtf8(' % MATCH ? ORDER BY rank DESC ', ['SearchTable'], [SearchPhrase],True); SearchPhrase:='abcde' ;

Edit1.Caption := mormot.core.json.FormatUtf8(' % MATCH ? ORDER BY rank DESC ', ['SearchTable'], [123],True);

end;

上面的输出是:

SearchTable MATCH :('abcde'): ORDER BY rank DESC

SearchTable MATCH :(123): ORDER BY rank DESC

据说mormot 带上 :( ): 是为了优化数据查询,估计是内存中吧!这并不是数据库的特性。

下面的输出是:

SearchTable MATCH 123 ORDER BY rank DESC

SearchTable MATCH "abcde" ORDER BY rank DESC



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。