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安装
boss install github.com/digao-dalpiaz/Dam
手动安装
克隆项目到本地
将Dam单元文件添加到Delphi项目的搜索路径中
根据目标数据库添加相应的数据库驱动单元
使用示例
示例1:定义实体类
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:数据库连接与查询
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:使用事务
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:复杂查询与关联
// 定义关联实体
[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提供了流畅的查询构建器接口,支持复杂的查询条件:
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. 数据验证
框架支持基本的数据验证功能:
[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提供了连接池支持:
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;性能优化建议
使用参数化查询:始终使用参数化查询防止SQL注入并提高性能
合理使用事务:将多个操作包装在事务中减少磁盘I/O
选择性加载:只查询需要的字段,避免
SELECT *连接池:在高并发场景下使用连接池管理数据库连接
批量操作:对于大量数据插入/更新,使用批量操作接口
与其他Pascal数据库框架对比
| 特性 | Pascal Dam | Delphi’s FireDAC | AnyDAC |
|---|---|---|---|
| 学习曲线 | 平缓 | 陡峭 | 中等 |
| 配置复杂度 | 简单 | 复杂 | 中等 |
| 性能 | 优秀 | 优秀 | 优秀 |
| 数据库支持 | 广泛 | 非常广泛 | 广泛 |
| 轻量级 | 是 | 否 | 中等 |
适用场景
中小型桌面应用程序:需要简单数据库操作的桌面应用
原型开发:快速构建数据库驱动的应用原型
教育项目:学习Pascal和数据库编程的优秀选择
工具类软件:配置存储、数据管理等工具软件
移动应用:配合FireMonkey框架开发跨平台移动应用
总结
Pascal Dam是一个设计精良、易于使用的数据库访问框架,特别适合希望简化数据库操作同时保持代码清晰度的Pascal开发者。它的轻量级设计和直观的API使得数据库编程变得更加愉快和高效。无论是初学者还是经验丰富的开发者,都能从Dam框架中受益。
项目持续维护中,拥有活跃的社区支持和详细的文档,是Pascal生态系统中值得关注的数据库工具之一。




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