本文作者:icy

Pascal Dam:简化数据库访问的轻量级ORM框架

icy 前天 42 抢沙发
Pascal Dam:简化数据库访问的轻量级ORM框架摘要: Pascal Dam:简化数据库访问的轻量级ORM框架 项目概述 Pascal Dam是一个用Delphi/Object Pascal编写的轻量级数据库访问框架,旨在简化数据库操作...

Pascal Dam:简化数据库访问的轻量级ORM框架

Pascal Dam:简化数据库访问的轻量级ORM框架

项目概述

Pascal Dam是一个用Delphi/Object Pascal编写的轻量级数据库访问框架,旨在简化数据库操作并提供类型安全的查询体验。该项目由Digao Dalpiaz开发并维护,采用MIT许可证,为Pascal开发者提供了一个优雅的数据库访问解决方案。

核心特性

1. 简洁的API设计

Dam框架提供了直观的API,让开发者能够以声明式的方式操作数据库,无需编写复杂的SQL字符串拼接代码。

2. 类型安全

通过泛型和强类型支持,Dam在编译时就能捕获许多潜在的错误,减少了运行时异常的风险。

3. 多数据库支持

支持多种数据库后端,包括: - SQLite - Firebird - MySQL - PostgreSQL - Microsoft SQL Server

4. 实体映射

通过简单的属性装饰器,可以将Pascal类映射到数据库表,实现对象关系映射(ORM)功能。

5. 事务支持

提供完整的事务管理功能,确保数据操作的原子性和一致性。

安装与配置

通过Boss安装

text
boss install github.com/digao-dalpiaz/Dam

手动安装

  1. 克隆项目到本地

  2. 将Dam单元文件添加到Delphi项目的搜索路径中

  3. 根据目标数据库添加相应的数据库驱动单元

使用示例

示例1:定义实体类

text
uses
  Dam;

type
  [Table('customers')]
  TCustomer = class
  private
    FId: Integer;
    FName: string;
    FEmail: string;
    FCreatedAt: TDateTime;
  public
    [Column('id', [cpPrimaryKey, cpAutoGenerated])]
    property Id: Integer read FId write FId;
    
    [Column('name', [cpRequired])]
    property Name: string read FName write FName;
    
    [Column('email')]
    property Email: string read FEmail write FEmail;
    
    [Column('created_at')]
    property CreatedAt: TDateTime read FCreatedAt write FCreatedAt;
  end;

示例2:数据库连接与查询

text
var
  DB: TDamDB;
  Customer: TCustomer;
  Customers: TObjectList<TCustomer>;
begin
  // 创建数据库连接(SQLite示例)
  DB := TDamDB.Create('SQLite', 'mydatabase.db');
  try
    // 创建表(如果不存在)
    DB.CreateTable<TCustomer>;
    
    // 插入新记录
    Customer := TCustomer.Create;
    try
      Customer.Name := 'John Doe';
      Customer.Email := 'john@example.com';
      Customer.CreatedAt := Now;
      DB.Insert(Customer);
    finally
      Customer.Free;
    end;
    
    // 查询所有客户
    Customers := DB.SelectAll<TCustomer>;
    try
      for Customer in Customers do
        WriteLn(Customer.Name + ' - ' + Customer.Email);
    finally
      Customers.Free;
    end;
    
    // 条件查询
    Customers := DB.Select<TCustomer>.Where('name = :name', ['John Doe']).ToList;
    try
      // 处理查询结果
    finally
      Customers.Free;
    end;
    
    // 更新记录
    DB.Update<TCustomer>
      .Set('email', 'newemail@example.com')
      .Where('id = :id', [1])
      .Execute;
      
    // 删除记录
    DB.Delete<TCustomer>.Where('id = :id', [1]).Execute;
    
  finally
    DB.Free;
  end;
end;

示例3:使用事务

text
var
  DB: TDamDB;
begin
  DB := TDamDB.Create('SQLite', 'mydatabase.db');
  try
    DB.StartTransaction;
    try
      // 执行多个数据库操作
      DB.ExecSQL('INSERT INTO customers (name) VALUES (:name)', ['Alice']);
      DB.ExecSQL('INSERT INTO orders (customer_id, amount) VALUES (:cid, :amt)', [1, 99.99]);
      
      // 提交事务
      DB.Commit;
    except
      // 发生异常时回滚
      DB.Rollback;
      raise;
    end;
  finally
    DB.Free;
  end;
end;

示例4:复杂查询与关联

text
// 定义关联实体
[Table('orders')]
TOrder = class
private
  FId: Integer;
  FCustomerId: Integer;
  FAmount: Currency;
  FOrderDate: TDateTime;
public
  [Column('id', [cpPrimaryKey, cpAutoGenerated])]
  property Id: Integer read FId write FId;
  
  [Column('customer_id')]
  property CustomerId: Integer read FCustomerId write FCustomerId;
  
  [Column('amount')]
  property Amount: Currency read FAmount write FAmount;
  
  [Column('order_date')]
  property OrderDate: TDateTime read FOrderDate write FOrderDate;
end;

// 执行关联查询
var
  DB: TDamDB;
  Query: IDamQuery;
begin
  DB := TDamDB.Create('SQLite', 'mydatabase.db');
  try
    Query := DB.CreateQuery(
      'SELECT c.name, c.email, o.amount, o.order_date ' +
      'FROM customers c ' +
      'INNER JOIN orders o ON c.id = o.customer_id ' +
      'WHERE o.amount > :min_amount',
      [100.00]
    );
    
    while not Query.Eof do
    begin
      WriteLn(Query.FieldAsString('name') + 
              ' - Order: $' + 
              Query.FieldAsString('amount'));
      Query.Next;
    end;
  finally
    DB.Free;
  end;
end;

高级功能

1. 查询构建器

Dam提供了流畅的查询构建器接口,支持复杂的查询条件:

text
var
  Customers: TObjectList<TCustomer>;
begin
  Customers := DB.Select<TCustomer>
    .Where('created_at > :date', [EncodeDate(2023, 1, 1)])
    .OrderBy('name')
    .Limit(10)
    .ToList;
  // 使用Customers...
end;

2. 数据验证

框架支持基本的数据验证功能:

text
[Table('products')]
TProduct = class
private
  FPrice: Double;
public
  [Column('price')]
  [MinValue(0, 'Price cannot be negative')]
  property Price: Double read FPrice write FPrice;
end;

3. 连接池管理

对于需要高性能的应用程序,Dam提供了连接池支持:

text
var
  Pool: TDamConnectionPool;
begin
  Pool := TDamConnectionPool.Create(
    function: TDamDB
    begin
      Result := TDamDB.Create('MySQL', 'Server=localhost;Database=mydb;User=root;Password=123456');
    end,
    10  // 最大连接数
  );
  
  // 从池中获取连接
  DB := Pool.GetConnection;
  try
    // 使用数据库连接
  finally
    // 将连接返回池中
    Pool.ReleaseConnection(DB);
  end;
end;

性能优化建议

  1. 使用参数化查询:始终使用参数化查询防止SQL注入并提高性能

  2. 合理使用事务:将多个操作包装在事务中减少磁盘I/O

  3. 选择性加载:只查询需要的字段,避免SELECT *

  4. 连接池:在高并发场景下使用连接池管理数据库连接

  5. 批量操作:对于大量数据插入/更新,使用批量操作接口

与其他Pascal数据库框架对比

特性Pascal DamDelphi&rsquo;s FireDACAnyDAC
学习曲线平缓陡峭中等
配置复杂度简单复杂中等
性能优秀优秀优秀
数据库支持广泛非常广泛广泛
轻量级中等

适用场景

  1. 中小型桌面应用程序:需要简单数据库操作的桌面应用

  2. 原型开发:快速构建数据库驱动的应用原型

  3. 教育项目:学习Pascal和数据库编程的优秀选择

  4. 工具类软件:配置存储、数据管理等工具软件

  5. 移动应用:配合FireMonkey框架开发跨平台移动应用

总结

Pascal Dam是一个设计精良、易于使用的数据库访问框架,特别适合希望简化数据库操作同时保持代码清晰度的Pascal开发者。它的轻量级设计和直观的API使得数据库编程变得更加愉快和高效。无论是初学者还是经验丰富的开发者,都能从Dam框架中受益。

项目持续维护中,拥有活跃的社区支持和详细的文档,是Pascal生态系统中值得关注的数据库工具之一。

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

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

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

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

验证码

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

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