[Dbix-class] Schema::Loader and views on Pg

Matt S Trout mst at shadowcat.co.uk
Sun May 2 19:59:56 GMT 2010


On Sat, May 01, 2010 at 12:53:28PM -0700, Dorian Taylor (Lists) wrote:
> Hey guys, been a while...

Welcome back.
 
> I have a Postgres (current) database that has a bunch of log tables.  
> On top of those is a bunch of views that take the most recent record,  
> basically going like:
> 
> CREATE VIEW foo AS SELECT * FROM foo_log a
> WHERE NOT EXISTS (SELECT 1 from foo_log b where b.since > a.since);
> 
> ("Since" is a timestamp and part of the primary key in the log table,  
> but not in the view, of course.)
> 
> Anyhow, I'm trying to use Schema::Loader (current) to build out the  
> schema and it (naturally) sees these views as not having primary keys  
> and the columns as nullable (they aren't in the underlying tables) and  
> of course no relationships, though the underlying log tables are  
> related to one another. I don't expect Schema::Loader can see that, I  
> just want to override it.
> 
> So what I'm wondering is if there is a way to tell Schema::Loader  
> "these views are just like those tables minus one dimension" or if I'm  
> better off just concocting the classes for those views by hand.

What about letting S::L pull the column names and then just setting the
primary keys and adding rels as a fixup?

Note that once you've got $other_class loaded you can always do

my $source = My::Schema::Foo->result_source_instance;

and then pull the relationships straight out of the main foo source.

See the code in

git://git.shadowcat.co.uk/dbsrights/DBIx-Class-ResultSource-MultipleTableInheritance.git

for some interesting Pg madness with views and result source introspection
(also, mad props to Amiri Barksdale for documenting the thing for me - just
waiting for a couple more people to say "yes it works" and I'll see about
shipping it to CPAN)

> Oh, one other thing. I could have sworn a few years ago that I could  
> abridge the class names in relation specs, just putting Foo instead of  
> My::Schema::Foo in has_many/belongs_to etc. Did that change?

It only ever sort of worked. In fact, IME it only worked reliably if you
were me (or at least wrote all your add_relationship calls by hand with
explicit join conditions).

After trying about ten different ways to fix it and realising that very
few people used the thing at all, I ripped it out sideways on the grounds
that "never works" was overall less annoying than "mostly works except you
get half way through a project and hit a bug and get an incomprehensible
error message".

Also, aliased.pm can pretty much eliminate the extra typing just as well :)

-- 
Matt S Trout - Shadowcat Systems - Perl consulting with a commit bit and a clue

http://shadowcat.co.uk/blog/matt-s-trout/   http://twitter.com/shadowcat_mst/

Email me now on mst (at) shadowcat.co.uk and let's chat about how our Catalyst
commercial support, training and consultancy packages could help your team.



More information about the DBIx-Class mailing list