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 获取源码
git clone https://github.com/synopse/mORMot.git
在 Delphi 中添加路径
打开 Delphi IDE
进入 Tools → Options → Language → Delphi Options → Library
添加 mORMot 源码路径到 Library path
基础使用示例
示例 1:定义数据模型和 REST 服务
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:实现服务器端
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:客户端调用
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 实时通信
// 定义 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;数据库迁移和版本控制
// 定义带版本的数据模型 Model := TSQLModel.Create([TCustomer, TOrder], 'root'); Model.Version := 2; // 设置模型版本 // 自动处理数据库迁移 Server := TSQLRestServerDB.Create(Model, 'data.db3', True); // 第三个参数 True 表示自动创建或更新表结构
性能优势
卓越的性能:mORMot 在设计上注重性能,特别是在序列化/反序列化和数据库访问方面
低内存占用:使用原生 Pascal 类型和高效的内存管理
编译时安全:强类型检查和编译时验证
零依赖:除了数据库驱动外,无外部依赖
适用场景
企业级桌面应用程序
需要本地数据库的移动应用
中小型 Web 应用程序
微服务架构
需要高性能数据访问的应用程序
需要 REST API 的传统 Delphi 应用现代化改造
学习资源
官方文档:https://synopse.info/files/html/Synopse%20mORMot%20Framework%20SAD%201.18.html
GitHub 仓库:https://github.com/synopse/mORMot
示例代码:仓库中的
SQLite3\Samples目录
总结
mORMot 为 Pascal 开发者提供了一个现代化、功能全面的开发框架。它将传统的 Delphi/FreePascal 开发带入了现代 Web 和云服务时代,同时保持了 Pascal 语言的类型安全和性能优势。无论是开发传统的桌面应用,还是构建 RESTful API 服务,mORMot 都是一个值得考虑的优秀选择。
通过其丰富的功能集和活跃的社区支持,mORMot 正在成为 Pascal 生态系统中最重要的全栈开发框架之一。对于希望使用 Object Pascal 进行现代应用程序开发的开发者来说,mORMot 提供了一个强大而高效的工具集。




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