如何将SQL与面向对象的Perl进行组合?

前端之家收集整理的这篇文章主要介绍了如何将SQL与面向对象的Perl进行组合?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前负责一个似乎与数据库非常亲密的过程.我的程序/脚本/框架的目标是从不同的数据源中统一出来.使用一种形式的依赖注入,我的进程在一个非常高的水平工作正常.每个数据源类型的实现都是从最高级别的业务抽象中隐藏的.大.我的问题是两个.

1)在Perl空间中组合一个sql语句(如何将这些不同的数据源转换成一个同构的最终格式),我有一个长的段落(这是我的困扰).所以sql字符串总是取决于我正在使用的数据类型. WHERE子句依赖,FROM子句依赖,INSERT子句依赖,这一切都取决于.这是高度的依赖性让我感到困惑.如何以面向对象的方式建模这个过程? MagicObject-> buildsql?这实际上是我现在的,但是觉得代码的所有部分都知道得太多,因此它的长度.

2)如果我有一个功能(建立sql?),我是否将整个业务对象传递给最后一刻呢?或者我们是否早期进行字符串化,只让我的函数处理所需要的内容,而不是渲染对象本身?

编辑:虽然我不怀疑ORM的重要性,但我不相信我们还在ORM领域.想象一下,美国,国家和虚构联盟的棒球数据都以不同程度的规范化方式以非常不同的格式存储.我的过程是读取这些数据源,将它们放在一个统一的标准化池中.我觉得在我的过程之后发生对这些物体的ORM空间.我是一个数据管理员,如果你愿意的话.由于缺少一个统一的池,我基本上没有任何商业对象可以采取行动.

编辑^ 2:已经引起了我的注意,也许我没有详细描述问题空间.这是一个例子.

想像你必须在美国制作一个所有罪犯的主数据库.您公司的服务正在销售一个位于顶端的产品,并以干净,统一的格式提供对这些数据的访问.

这些数据由50个州公开提供,但格式不同.有些是一个数据文件,没有正常化.其他是CSV格式的归一化表.有些是Excel文档.有些是TSV.甚至提供一些不经手动干预(其他手动创建的数据源)的记录.

我的项目的目的是为50个州的每一个制造一个“司机”,并确保该过程的最终产品是完美的关系模型中的罪犯的主数据库.一切都正确键入,完美形状的模式等

解决方法

你想看看 Fey.几个月前我开始使用这个工作,而由于年龄的小小,执行工作仍然有很大的变化,所以背后的想法是坚实的. F.ex.,从手册中轻轻地修改了一个查询
my $user = $schema->table( 'user' );
my $q = Fey::sql
    ->new_select
    ->select( $user->columns( 'user_id','username' ) )
    ->from( $user );

现在你可以编写一个这样的函数

sub restrict_with_group {
    my ( $q,$table,@group_id ) = @_;
    my $group = $schema->table( 'group' )->alias;
    $q
        ->from( $table,$group )
        ->where( $group->column( 'group_id' ),'IN',@group_id );
}

这将添加用户到组的内部连接以及WHERE条件.瞧,您可以在主程序中写下列内容

restrict_with_group( $q,$user,qw( 1 2 3 ) );

但是,这个restrict_with_group函数可用于任何具有组表的外键的查询!要使用它,您传递要限制的查询以及要应用限制的表,以及要限制的限制的组ID.

最后你会说$q-> sql($dbh),并返回一个表示您在$q对象中构建的查询sql字符串.

所以基本上Fey给你本机sql缺少的抽象功能.您可以从查询提取可重复使用的方面,并将其打包为单独的功能.

猜你在找的MsSQL相关文章