本文作者:icy

mORMot:Delphi/FreePascal 下的高性能 ORM 与 Web 框架

icy 今天 15 抢沙发
mORMot:Delphi/FreePascal 下的高性能 ORM 与 Web 框架摘要: mORMot:Delphi/FreePascal 下的高性能 ORM 与 Web 框架 项目概述 mORMot 是一个用 Object Pascal 编写的开源框架,专为 Delp...

mORMot:Delphi/FreePascal 下的高性能 ORM 与 Web 框架

mORMot:Delphi/FreePascal 下的高性能 ORM 与 Web 框架

项目概述

mORMot 是一个用 Object Pascal 编写的开源框架,专为 Delphi 和 FreePascal 设计。它不仅仅是一个简单的 ORM(对象关系映射)工具,更是一个全栈开发框架,集成了数据库访问、RESTful 服务、Web 服务器、客户端-服务器架构等多种功能。该项目由 Synopse 开发和维护,以其高性能、低资源消耗和丰富的功能集而闻名。

核心特性

1. 强大的 ORM 功能

  • 支持多种数据库后端(SQLite3、Oracle、MySQL、PostgreSQL、MSSQL、Firebird 等)

  • 零配置的数据库表创建和迁移

  • 高效的缓存机制和懒加载支持

  • 事务管理和数据验证

2. 完整的 RESTful 服务框架

  • 自动将 Pascal 类转换为 REST API

  • 支持 JSON、XML 等多种数据格式

  • 内置认证和授权机制

  • 可扩展的服务接口

3. 内置 HTTP/HTTPS 服务器

  • 高性能的 HTTP 服务器(基于 WinHTTP 或 http.sys)

  • 支持 WebSocket 实时通信

  • 静态文件服务和模板引擎

  • MVC 架构支持

4. 客户端-服务器架构

  • 自动生成客户端代理代码

  • 支持多种传输协议(HTTP、WebSocket、命名管道等)

  • 服务订阅和回调机制

  • 离线数据同步能力

5. 跨平台支持

  • 支持 Windows、Linux、macOS

  • 兼容 Delphi 6 到最新版本

  • 支持 FreePascal 编译器

  • 移动端开发支持(通过 Delphi FMX)

安装与配置

通过 Git 获取源码

text
git clone https://github.com/synopse/mORMot.git

在 Delphi 中添加路径

  1. 打开 Delphi IDE

  2. 进入 Tools → Options → Language → Delphi Options → Library

  3. 添加 mORMot 源码路径到 Library path

基础使用示例

示例 1:定义数据模型和 REST 服务

text
unit SampleData;

interface

uses
  mORMot;

type
  // 定义客户实体
  TCustomer = class(TSQLRecord)
  private
    FName: RawUTF8;
    FEmail: RawUTF8;
    FRegistrationDate: TDateTime;
  published
    property Name: RawUTF8 read FName write FName;
    property Email: RawUTF8 read FEmail write FEmail;
    property RegistrationDate: TDateTime read FRegistrationDate 
      write FRegistrationDate;
  end;

  // 定义订单实体
  TOrder = class(TSQLRecord)
  private
    FCustomerID: TID;
    FProductName: RawUTF8;
    FQuantity: Integer;
    FOrderDate: TDateTime;
  published
    property CustomerID: TID read FCustomerID write FCustomerID;
    property ProductName: RawUTF8 read FProductName write FProductName;
    property Quantity: Integer read FQuantity write FQuantity;
    property OrderDate: TDateTime read FOrderDate write FOrderDate;
  end;

  // 定义服务接口
  ISampleService = interface(IInvokable)
    ['{9A60C8ED-CEB2-4E41-87F3-4D4F1D749850}']
    function AddCustomer(const Name, Email: RawUTF8): TID;
    function PlaceOrder(CustomerID: TID; const ProductName: RawUTF8; 
      Quantity: Integer): TID;
    function GetCustomerOrders(CustomerID: TID): TSQLOrderDynArray;
  end;

implementation

initialization
  // 注册服务接口
  TInterfaceFactory.RegisterInterfaces([TypeInfo(ISampleService)]);
end.

示例 2:实现服务器端

text
unit SampleServer;

interface

uses
  mORMot, mORMotHttpServer, SampleData;

type
  TSampleService = class(TInterfacedObject, ISampleService)
  public
    function AddCustomer(const Name, Email: RawUTF8): TID;
    function PlaceOrder(CustomerID: TID; const ProductName: RawUTF8; 
      Quantity: Integer): TID;
    function GetCustomerOrders(CustomerID: TID): TSQLOrderDynArray;
  end;

implementation

function TSampleService.AddCustomer(const Name, Email: RawUTF8): TID;
var
  Customer: TCustomer;
begin
  Customer := TCustomer.Create;
  try
    Customer.Name := Name;
    Customer.Email := Email;
    Customer.RegistrationDate := Now;
    Result := Server.Add(Customer, True);
  finally
    Customer.Free;
  end;
end;

function TSampleService.PlaceOrder(CustomerID: TID; const ProductName: RawUTF8; 
  Quantity: Integer): TID;
var
  Order: TOrder;
begin
  Order := TOrder.Create;
  try
    Order.CustomerID := CustomerID;
    Order.ProductName := ProductName;
    Order.Quantity := Quantity;
    Order.OrderDate := Now;
    Result := Server.Add(Order, True);
  finally
    Order.Free;
  end;
end;

function TSampleService.GetCustomerOrders(CustomerID: TID): TSQLOrderDynArray;
begin
  Result := Server.RetrieveList(TSQLOrder, 
    'CustomerID=?', [CustomerID]);
end;

// 启动服务器
procedure StartServer;
var
  Model: TSQLModel;
  Server: TSQLRestServer;
  HTTPServer: TSQLHttpServer;
begin
  // 创建数据模型
  Model := TSQLModel.Create([TCustomer, TOrder]);
  
  try
    // 创建 REST 服务器
    Server := TSQLRestServerDB.Create(Model, 'sample.db3');
    
    // 注册服务实现
    Server.ServiceRegister(TSampleService, [ISampleService]);
    
    // 创建 HTTP 服务器
    HTTPServer := TSQLHttpServer.Create('8080', [Server]);
    
    WriteLn('服务器已启动,监听端口 8080');
    WriteLn('按 Enter 键停止服务器...');
    ReadLn;
    
    HTTPServer.Free;
    Server.Free;
  finally
    Model.Free;
  end;
end;
end.

示例 3:客户端调用

text
unit SampleClient;

interface

uses
  mORMot, mORMotHttpClient, SampleData;

procedure TestClient;

implementation

procedure TestClient;
var
  Client: TSQLHttpClient;
  Service: ISampleService;
  CustomerID, OrderID: TID;
  Orders: TSQLOrderDynArray;
  I: Integer;
begin
  // 创建 HTTP 客户端
  Client := TSQLHttpClient.Create('localhost', '8080', TSQLModel.Create([TCustomer, TOrder]));
  try
    // 获取服务接口
    Client.ServiceDefine([ISampleService], sicShared);
    Client.Services.Resolve(ISampleService, Service);
    
    // 添加客户
    CustomerID := Service.AddCustomer('张三', 'zhangsan@example.com');
    WriteLn('客户添加成功,ID: ', CustomerID);
    
    // 下订单
    OrderID := Service.PlaceOrder(CustomerID, '笔记本电脑', 1);
    WriteLn('订单添加成功,ID: ', OrderID);
    
    // 查询订单
    Orders := Service.GetCustomerOrders(CustomerID);
    WriteLn('客户订单数量: ', Length(Orders));
    
    for I := 0 to High(Orders) do
    begin
      WriteLn('订单 ', I + 1, ':');
      WriteLn('  产品: ', Orders[I].ProductName);
      WriteLn('  数量: ', Orders[I].Quantity);
      WriteLn('  日期: ', DateTimeToStr(Orders[I].OrderDate));
    end;
    
  finally
    Client.Free;
  end;
end;
end.

高级特性示例

WebSocket 实时通信

text
// 定义 WebSocket 回调接口
IChatCallback = interface(IInvokable)
  ['{EA7EFE51-3EBA-4047-A356-2533746F6C14}']
  procedure NotifyMessage(const Msg: RawUTF8);
end;

// 聊天服务
IChatService = interface(IInvokable)
  ['{C92CAF82-3A5B-4B7D-8D3A-1E77E2F5A5F5}']
  procedure JoinChat(const UserName: RawUTF8);
  procedure SendMessage(const Msg: RawUTF8);
  procedure SubscribeMessages(const Callback: IChatCallback);
end;

数据库迁移和版本控制

text
// 定义带版本的数据模型
Model := TSQLModel.Create([TCustomer, TOrder], 'root');
Model.Version := 2; // 设置模型版本

// 自动处理数据库迁移
Server := TSQLRestServerDB.Create(Model, 'data.db3', True);
// 第三个参数 True 表示自动创建或更新表结构

性能优势

  1. 卓越的性能:mORMot 在设计上注重性能,特别是在序列化/反序列化和数据库访问方面

  2. 低内存占用:使用原生 Pascal 类型和高效的内存管理

  3. 编译时安全:强类型检查和编译时验证

  4. 零依赖:除了数据库驱动外,无外部依赖

适用场景

  • 企业级桌面应用程序

  • 需要本地数据库的移动应用

  • 中小型 Web 应用程序

  • 微服务架构

  • 需要高性能数据访问的应用程序

  • 需要 REST API 的传统 Delphi 应用现代化改造

学习资源

  1. 官方文档https://synopse.info/files/html/Synopse%20mORMot%20Framework%20SAD%201.18.html

  2. GitHub 仓库https://github.com/synopse/mORMot

  3. 示例代码:仓库中的 SQLite3\Samples 目录

  4. 论坛支持https://synopse.info/forum/

总结

mORMot 为 Pascal 开发者提供了一个现代化、功能全面的开发框架。它将传统的 Delphi/FreePascal 开发带入了现代 Web 和云服务时代,同时保持了 Pascal 语言的类型安全和性能优势。无论是开发传统的桌面应用,还是构建 RESTful API 服务,mORMot 都是一个值得考虑的优秀选择。

通过其丰富的功能集和活跃的社区支持,mORMot 正在成为 Pascal 生态系统中最重要的全栈开发框架之一。对于希望使用 Object Pascal 进行现代应用程序开发的开发者来说,mORMot 提供了一个强大而高效的工具集。

mORMot.zip
类型:压缩文件|已下载:0|下载方式:免费下载
立即下载
文章版权及转载声明

作者:icy本文地址:https://zelig.cn/2026/03/360.html发布于 今天
文章转载或复制请以超链接形式并注明出处软角落-SoftNook

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

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

评论列表 (暂无评论,15人围观)参与讨论

还没有评论,来说两句吧...