mORMot 1.18 第06章 概念

mORMot 1.18 第六章 概念

mORMot 应用程序通过 Object Pascal 类型定义数据库结构。该库大量使用运行时类型信息 (RTTI),之所以可能实现,是因为 Delphi 将类型信息存储在可执行文件中。

RTTI 可以说明一个变量是整数、双精度数、字符串、数组、特定类型的类等,对 ORM(对象关系映射)理解您的数据至关重要。

FreePascal 还没有存储 RTTI,但是有两种解决方案:一是使用 NewPascal(FreePascal 的一种变体),它可用于一些平台;另一种方法是在 Delphi 中生成 RTTI 并将其移植到 Free Pascal。有关所有这些选项的最新信息,请参阅在线文档。

继承是 mORMot 对象处理的核心。所有的数据库对象都派生自 TSQLRecord。TSQLSomeone 继承自 TSQLRecordTimeStamp,后者又继承自 TSQLRecord。

TSQLRecord 自动添加字段 ID,它是一个非零的正 64 位整数(类型 TID)。

如果您读取的记录索引为 0,说明没有这样的记录。

我们使用 RawUTF8 而不是字符串,这是数据库使用的 ASCII 编码。

以下概览对应“xxx\SQLite3\Samples\30 - MVC Server”示例

  TSQLSomeone = class(TSQLRecordTimeStamped)
  private
    fFirstName: RawUTF8;
    fFamilyName: RawUTF8;
    fBirthDate: TDateTime;
    fEmail: RawUTF8;
    fVerified: boolean;
    fHashedPassword: RawUTF8;
    fLogonName: RawUTF8;
  public
    function ComputeHash(const PlainPassword: RawUTF8): RawUTF8; virtual;
    procedure SetPlainPassword(const PlainPassword: RawUTF8);
    function CheckPlainPassword(const PlainPassword: RawUTF8): boolean;
    function Name: RawUTF8; 
  published
    property LogonName: RawUTF8 index 30 read fLogonName write fLogonName stored AS_UNIQUE;
    property FirstName: RawUTF8 index 50 read fFirstName write fFirstName;
    property FamilyName: RawUTF8 index 50 read fFamilyName write fFamilyName;
    property BirthDate: TDateTime read fBirthDate write fBirthDate;
    property Email: RawUTF8 index 40 read fEmail write fEmail;
    property HashedPassword: RawUTF8 index 64 read fHashedPassword write fHashedPassword;
    property Verified: boolean read fVerified write fVerified;
  end; 

TSQLRecord.LoginName 定义为索引 30,意味着最大长度为 30,或 SQL 用户使用的 varchar(30)。

TSQLSomeone.LoginName 存储为 RAWUTF8 格式的 AS_UNIQUE。这意味着数据库将强制字段的唯一性。这是标准的数据库内容,但您会发现它直接应用于应用程序编程语言中,而不仅仅是 SQL。

TSQLSomone.Birthdate 是一个 TDateTime 类型,您可以随时设置。但 TSQLRecordTimeStamp 的 CreatedAt 是 TCreateTime 类型。mORMot 足够智能,可以在我们创建记录时设置此值,但在我们读取或写入记录时不会更新它。

同样,每当我们修改记录时,TSQLRecordTimeStamp.ModifiedAt 会自动更新。这些都是内置的。

ORM 字段应该定义为发布的。可以将读取或写入部分设置为函数来读取或保存值。

还可以创建具有写入功能但没有读取函数或值的黑洞属性。密码文本属性就是这样的;例程 SetPlainPassword(password: RawUTF8) 采用输入密码并将其转换为可以安全存储的加密哈希,但您永远无法重新读取明文密码,因为它根本没有以明文格式存储。

同样,也有一些情况只有读取功能才有意义。假设您存储了一个名为 JobStatus 的值,该值映射为一个整数或枚举,以便在内部进行高效处理。您可以使用 GetJobStatusText: RawUTF8 的读取函数定义 JobStatusText,该函数将该整数/枚举转换为常量文本字符串。每当结构通过网络传递时,作为传输的一部分,会自动返回最新的字符串,但实际上您从未存储文本部分,它是在读取属性时动态生成的。

TSQLSomeone.Name 是一个复合字段,由名字和姓氏组成。无需在代码中用名字和姓氏进行拼接。

6.1 像积木一样

一旦定义了数据模型,mORMot 就像儿童的积木一样工作,您可以使用任何支持的技术互换地构建解决方案。

例如,您可以使用或更改为任何支持的数据库,或者只需一行更新。

使用本地或远程数据库,通过 REST 或 Web 协议连接到桌面或远程桌面上的本地客户端。可以使用 Microsoft 网络、TCP/IP 网络、命名管道等。

6.2 程序类型

mORMot 程序可以编译为:

  • 用户模式的 GUI 应用程序
  • 用户模式的控制台(文本)应用程序
  • 守护进程/服务

适用于几乎所有平台:Windows、Linux、Mac OS/X、iOS、Android。

使用 Delphi/Rad Studio for Windows,您可以使用 VCL,以及在 Windows 和该编译器支持的其他平台上使用更通用的 FMX 图形。FreePascal 可以与所有平台上的文本模式应用程序一起使用,或者可以与 Lazarus 结合使用。

我们通常会做用户文本模式和用户 GUI 模式应用程序,以证明如何完成任务并验证每个示例是否有效。但是,将此级别的开发人员将文本模式应用程序放入守护进程/服务中,或增强它以使用 Delphi/Lazarus (FreePascal) UI 被认为是微不足道的,因此不会解释基本的 Delphi 图形库。

对于 GUI,我们将主要依靠 Elevate Web Builder 来制作快速、有吸引力的 Web 应用程序。

6.3 使用哪个数据库品牌

根据应用程序的不同,您可能可以选择使用的数据库技术,因为您可能是从头开始的。即使您从旧技术开始,也值得了解所有选项。

所有支持的数据库都具有 ACID(原子性、一致性、隔离性、持久性)特性集,该特性集通过使用可以完全工作或撤消的事务来保证数据库事务得到可靠处理。

6.2 程序的类型

mORMot程序可以编译成:

  • 用户模式的图形用户界面(GUI)应用程序
  • 用户模式的控制台(文本)应用程序
  • 守护进程/服务

这些应用程序可以在几乎所有平台上运行:Windows、Linux、Mac OS/X、iOS、Android。

在Windows上使用Delphi/Rad Studio,你可以采用VCL,在Windows和其他平台上,该编译器还支持更通用的FMX图形库。FreePascal可以与所有平台上的文本模式应用程序一起使用,或者可以与Lazarus结合使用。

我们通常会构建用户文本模式和用户GUI模式的应用程序,以证明如何完成任务并验证每个示例是否有效。但是,对于这个级别的开发人员来说,将文本模式应用程序放入守护进程/服务中,或增强它以使用Delphi/Lazarus(FreePascal) UI被认为是微不足道的,因此这里不会解释基本的Delphi图形库。

对于GUI,我们将主要依靠Elevate Web Builder来制作快速、有吸引力的Web应用程序。

6.3 使用哪个数据库品牌

根据应用程序的不同,您可能可以选择要使用的数据库技术,因为您可能是从头开始构建。即使您是从旧技术开始的,也值得了解所有选项。

所有支持的数据库都具有ACID(原子性、一致性、隔离性、持久性)特性集,这是一组属性,它们通过使用可以完全工作或撤消的事务来保证数据库事务的可靠处理。

此外,在选择数据库时,您还应该考虑以下因素:性能、可扩展性、易用性、社区支持和许可要求。例如,一些数据库是开源的,而另一些则需要付费许可。根据您的项目需求和预算,选择最适合您的数据库品牌。

对于mORMot框架,它支持多种数据库,因此您可以根据项目需求灵活选择。无论您选择哪种数据库,mORMot都能帮助您高效地管理和操作数据。

(注意:此段为译者根据上下文添加的内容,以帮助读者更好地理解原文)

在选择数据库时,务必确保其与您的开发环境和工具链兼容,以便能够无缝集成并实现高效的数据处理。同时,了解数据库的性能和可扩展性也非常重要,以确保其能够满足您应用程序的需求。最后,不要忘记考虑数据库的安全性和可靠性,以保护您的数据免受未经授权的访问和损坏。

6.4 外部数据库

Oracle 一个行业领先的商业企业级数据库。通过自定义的Oracle驱动程序直接支持。

TSQLDBOracleConnectionProperties.Create(servername, databasename, userid, password);

MS-SQL 一个市场领先的商业企业级/工作组级数据库。

通过各种数据库驱动程序间接支持。

TOleDBMSSQL2008ConnectionProperties.Create(Servername, databaseneame, userid, password);

PostGreSQL 一个通过各种数据库驱动程序支持的开源企业级数据库。

MySQL 一个工作组级数据库。mORMot通过ODBC和其他数据库驱动程序间接支持。有一章专门讨论MySQL。

SQLite3 一个优化的、轻量级的、基于磁盘的数据库。如果在ACID磁盘模式下使用,速度相对较慢。但如果在ACID-RAM模式下使用,并且如示例项目15所示设置DB.Synchronous := smOff和/或DB.LockingMode := lmExclusive,则其速度非常快。

TSQLDBSQLite3ConnectionProperties.Create('', databasefilename, '', '' );

内存模式数据库 一个内部内存数据库。

TSQLRestStorageInMemory.Create('','','','' );

MongoDB 一个NoSQL数据库,非常适合数据模型无法完全预先预测的情况。

StaticMongoDBRegister(servername, database, userid, password);

现在,数据库已定义并建立连接,我们可以选择告诉mORMot使用以下命令将数据库更新到最新模型:

TSQLConnectionProperties.}CreateMissingTables;

如果我们不这样做,数据库可能无法准确地反映模型。在旧数据库中,您可能不会调用CreateMissingTables,但您有责任确保数据库反映数据模型。

热门相关:宝贝我要好好吃饭了   大唐扫把星   九星之主   田园晚色:肥妇三嫁良夫   战斗就变强