Using UR Perl ORM for the Model

208 views
Skip to first unread message

Chuck

unread,
Aug 15, 2011, 11:43:34 AM8/15/11
to Mojolicious
Hi,

First, I am really sorry if this is not the correct place to post
this. If this is not the right place, please advise. Thanks.

I've been looking a long time for a Perl MVC framework and finally
found one. I'm really excited to start using Mojolicious to write my
REST applications but I still wanted to find a good ORM for Perl as
I'd prefer that the people working on my project don't write any SQL
unless it is absolutley necessary. Fortunately I found UR (https://
github.com/genome/UR) and found it to be really promissing. So before
I went ahead and started using it, I thought I would give it a shot by
trying to make this Mojolicious REST App (https://github.com/koorchik/
FastNotes-Proto) use UR. My problem is that I think I'm getting
namespace conflicts but I don't know how to resolve them. This is the
FastNotes project tree I have:

fastnotes
├── app.psgi -> script/fastnotes.pl
├── fastnotes.json
├── lib
│   ├── FastNotes
│   │   ├── Controller
│   │   │   ├── Auths.pm
│   │   │   ├── Notes.pm
│   │   │   └── Users.pm
│   │   ├── Model
│   │   │   ├── Base.pm
│   │   │   ├── Note.pm
│   │   │   └── User.pm ------> This has the "select" method which
Perl is saying it cannot locate.
│   │   └── Model.pm ------> Here is where I "use FastNotesDB;"
which uses UR for the Model
│   └── FastNotes.pm
├── Makefile.PL
├── script
│   └── fastnotes.pl
├── storage
│   ├── fastnotes.db
│   ├── FastNotesDB -------> THIS IS WHERE ALL THE UR
STUFF IS LOCATED
│   │   ├── DataSource
│   │   │   ├── Database.pm
│   │   │   ├── Database.sqlite3 -> ../../fastnotes.db
│   │   │   ├── Meta.pm
│   │   │   ├── Meta.sqlite3
│   │   │   └── Meta.sqlite3-dump
│   │   ├── Note.pm
│   │   ├── User.pm ----> no "select" method here (I think this is
causing the problem but I'm not calling any method from here)
│   │   └── Vocabulary.pm
│   ├── FastNotesDB.pm


When I log in I get this error on my browser:

Can't locate object method "select" via package
"FastNotes::Model::User" at fastnotes/lib/FastNotes/Controller/
Auths.pm line 16.

11: my ($self) = @_;
12:
13: my $login = $self->param('login');
14: my $password = $self->param('password');
15:
16: my $user = FastNotes::Model::User->select({login => $login,
password=>$password});
17:
18: if ( $login && $user->{user_id} ) {
19: $self->session(
20: user_id => $user->{user_id},
21: login => $user->{login}

I'm explicitly calling FastNotes::Model::User 's select method and not
FastNotesDB::User ... so I don't know why it would be a problem.

Any help would be appreciated. I've been trying to fix this problem
for the past few days with no success.

Thanks.

Виктор Турский

unread,
Aug 15, 2011, 12:18:02 PM8/15/11
to mojol...@googlegroups.com
Check your "use" statements. Maybe you have forgotten to load
FastNotes::Model::User


--
З повагою,
Віктор Турський

Chuck

unread,
Aug 15, 2011, 1:50:53 PM8/15/11
to Mojolicious
Where would I need to do the loading of FastNotes::Model::User? I
haven't changed much from the original fastnotes application. This is
Model.pm:

package FastNotes::Model;
use strict;
use warnings;
use v5.10;

use lib '../../storage';
use FastNotesDB;
use Mojo::Loader;

my $modules = Mojo::Loader->search('FastNotes::Model');

foreach (@$modules) {
print "Loading $_...\n";
Mojo::Loader->load($_)
}

1;


So FastNotes::Model::User is loaded because I see the print statement
inside the foreach loop being executed when the app is launched.

Виктор Турский

unread,
Aug 15, 2011, 2:59:41 PM8/15/11
to mojol...@googlegroups.com
2011/8/15 Chuck <cfmw...@gmail.com>:

> Where would I need to do the loading of FastNotes::Model::User?  I
> haven't changed much from the original fastnotes application. This is
> Model.pm:

ok. Dump %INC just right before calling "my $user =


FastNotes::Model::User->select({login => $login,

password=>$password});" and check if FastNotes::Model::User is in
results

You can use Data::Dumper for it "$res = Dumper(\%INC);"

Chuck

unread,
Aug 15, 2011, 4:12:12 PM8/15/11
to Mojolicious
Ok, so I overlooked the fact that FastNotes::Model::User,
FastNotes::Model::Base, FastNotes::Model::Note only load when Model.pm
does not have the use statements I point out below:

package FastNotes::Model;
use strict;
use warnings;
use v5.10;

use Mojo::Loader;

use lib '../../storage'; <---- THIS
use FastNotesDB; <---- THIS

my $modules = Mojo::Loader->search('FastNotes::Model');

foreach (@$modules) {
print "Loading $_...\n";
Mojo::Loader->load($_);
}

1;

so when Model.pm looks like above:

%INC = {
'Time/Zone.pm' => '/usr/share/perl5/site_perl/Time/Zone.pm',
'Mojo/JSON.pm' => '/usr/share/perl5/site_perl/Mojo/JSON.pm',
'Mojolicious.pm' => '/usr/share/perl5/site_perl/
Mojolicious.pm',
'Cwd.pm' => '/usr/lib/perl5/core_perl/Cwd.pm',
'Mojo/IOLoop/Server.pm' => '/usr/share/perl5/site_perl/Mojo/
IOLoop/Server.pm',
'Mojo.pm' => '/usr/share/perl5/site_perl/Mojo.pm',
'Mojolicious/Plugin/RequestTimer.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/RequestTimer.pm',
'Digest/base.pm' => '/usr/share/perl5/core_perl/Digest/
base.pm',
'Mojolicious/Commands.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Commands.pm',
'URI.pm' => '/usr/share/perl5/site_perl/URI.pm',
'MIME/Base64.pm' => '/usr/lib/perl5/core_perl/MIME/
Base64.pm',
'IO/Socket/INET.pm' => '/usr/lib/perl5/core_perl/IO/Socket/
INET.pm',
'Mojo/Cookie/Response.pm' => '/usr/share/perl5/site_perl/
Mojo/Cookie/Response.pm',
'Errno.pm' => '/usr/lib/perl5/core_perl/Errno.pm',
'FastNotes/Model.pm' => undef,
'MIME/QuotedPrint.pm' => '/usr/lib/perl5/core_perl/MIME/
QuotedPrint.pm',
'File/Spec.pm' => '/usr/lib/perl5/core_perl/File/Spec.pm',
'File/Glob.pm' => '/usr/lib/perl5/core_perl/File/Glob.pm',
'Sys/Hostname.pm' => '/usr/lib/perl5/core_perl/Sys/
Hostname.pm',
'Mojo/Message/Request.pm' => '/usr/share/perl5/site_perl/
Mojo/Message/Request.pm',
'warnings/register.pm' => '/usr/share/perl5/core_perl/
warnings/register.pm',
'XSLoader.pm' => '/usr/lib/perl5/site_perl/XSLoader.pm',
'Encode/Alias.pm' => '/usr/lib/perl5/site_perl/Encode/
Alias.pm',
'Encode/Config.pm' => '/usr/lib/perl5/site_perl/Encode/
Config.pm',
'Mojo/Exception.pm' => '/usr/share/perl5/site_perl/Mojo/
Exception.pm',
'Mojo/Cookie.pm' => '/usr/share/perl5/site_perl/Mojo/
Cookie.pm',
'unicore/lib/Perl/SpacePer.pl' => '/usr/share/perl5/
core_perl/unicore/lib/Perl/SpacePer.pl',
'Mojo/Loader.pm' => '/usr/share/perl5/site_perl/Mojo/
Loader.pm',
'utf8.pm' => '/usr/share/perl5/core_perl/utf8.pm',
'IO/Socket/UNIX.pm' => '/usr/lib/perl5/core_perl/IO/Socket/
UNIX.pm',
'Mojo/Server/Daemon.pm' => '/usr/share/perl5/site_perl/Mojo/
Server/Daemon.pm',
'Mojo/Date.pm' => '/usr/share/perl5/site_perl/Mojo/Date.pm',
'Exporter/Heavy.pm' => '/usr/share/perl5/core_perl/Exporter/
Heavy.pm',
'File/Spec/Unix.pm' => '/usr/lib/perl5/core_perl/File/Spec/
Unix.pm',
'Mojo/Content/Single.pm' => '/usr/share/perl5/site_perl/Mojo/
Content/Single.pm',
'Mojo/Util.pm' => '/usr/share/perl5/site_perl/Mojo/Util.pm',
'Mojolicious/Plugin/EplRenderer.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/EplRenderer.pm',
'Mojo/Path.pm' => '/usr/share/perl5/site_perl/Mojo/Path.pm',
'AutoLoader.pm' => '/usr/share/perl5/core_perl/
AutoLoader.pm',
'lib.pm' => '/usr/lib/perl5/core_perl/lib.pm',
'Data/Dumper.pm' => '/usr/lib/perl5/site_perl/Data/
Dumper.pm',
'IO/Handle.pm' => '/usr/lib/perl5/core_perl/IO/Handle.pm',
'Mojolicious/Plugins.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Plugins.pm',
'SelectSaver.pm' => '/usr/share/perl5/core_perl/
SelectSaver.pm',
'Getopt/Long.pm' => '/usr/share/perl5/core_perl/Getopt/
Long.pm',
'IO/Socket.pm' => '/usr/lib/perl5/core_perl/IO/Socket.pm',
'Mojo/DOM/HTML.pm' => '/usr/share/perl5/site_perl/Mojo/DOM/
HTML.pm',
'Mojolicious/Sessions.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Sessions.pm',
'Mojo/DOM.pm' => '/usr/share/perl5/site_perl/Mojo/DOM.pm',
'UNIVERSAL.pm' => '/usr/share/perl5/core_perl/UNIVERSAL.pm',
'Mojolicious/Routes.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Routes.pm',
'Mojolicious/Plugin/DefaultHelpers.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/DefaultHelpers.pm',
'Mojo/Log.pm' => '/usr/share/perl5/site_perl/Mojo/Log.pm',
'Mojo/Parameters.pm' => '/usr/share/perl5/site_perl/Mojo/
Parameters.pm',
'Digest/MD5.pm' => '/usr/lib/perl5/core_perl/Digest/MD5.pm',
'File/Path.pm' => '/usr/share/perl5/core_perl/File/Path.pm',
'FindBin.pm' => '/usr/share/perl5/core_perl/FindBin.pm',
'Mojo/Transaction/HTTP.pm' => '/usr/share/perl5/site_perl/
Mojo/Transaction/HTTP.pm',
'IO/Seekable.pm' => '/usr/lib/perl5/core_perl/IO/
Seekable.pm',
'File/Copy.pm' => '/usr/share/perl5/core_perl/File/Copy.pm',
'Encode.pm' => '/usr/lib/perl5/site_perl/Encode.pm',
'base.pm' => '/usr/share/perl5/core_perl/base.pm',
'Config.pm' => '/usr/lib/perl5/core_perl/Config.pm',
'File/Basename.pm' => '/usr/share/perl5/core_perl/File/
Basename.pm',
'FastNotesDB.pm' => undef,
'integer.pm' => '/usr/share/perl5/core_perl/integer.pm',
'Mojo/Asset/Memory.pm' => '/usr/share/perl5/site_perl/Mojo/
Asset/Memory.pm',
'Mojolicious/Plugin.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Plugin.pm',
'Carp.pm' => '/usr/share/perl5/core_perl/Carp.pm',
'Date/Format.pm' => '/usr/share/perl5/site_perl/Date/
Format.pm',
'utf8_heavy.pl' => '/usr/share/perl5/core_perl/
utf8_heavy.pl',
'Mojolicious/Plugin/CallbackCondition.pm' => '/usr/share/
perl5/site_perl/Mojolicious/Plugin/CallbackCondition.pm',
'Mojo/DOM/CSS.pm' => '/usr/share/perl5/site_perl/Mojo/DOM/
CSS.pm',
'constant.pm' => '/usr/share/perl5/core_perl/constant.pm',
'Mojo/Content/MultiPart.pm' => '/usr/share/perl5/site_perl/
Mojo/Content/MultiPart.pm',
'IO/File.pm' => '/usr/lib/perl5/core_perl/IO/File.pm',
'URI/Escape.pm' => '/usr/share/perl5/site_perl/URI/
Escape.pm',
'DynaLoader.pm' => '/usr/lib/perl5/core_perl/DynaLoader.pm',
'feature.pm' => '/usr/share/perl5/core_perl/feature.pm',
'Net/SSLeay.pm' => '/usr/lib/perl5/vendor_perl/Net/
SSLeay.pm',
'Mojo/IOLoop/Resolver.pm' => '/usr/share/perl5/site_perl/
Mojo/IOLoop/Resolver.pm',
'List/Util.pm' => '/usr/lib/perl5/core_perl/List/Util.pm',
'Mojo/IOLoop/Stream.pm' => '/usr/share/perl5/site_perl/Mojo/
IOLoop/Stream.pm',
'File/Find.pm' => '/usr/share/perl5/core_perl/File/Find.pm',
'Mojo/Asset/File.pm' => '/usr/share/perl5/site_perl/Mojo/
Asset/File.pm',
'Class/Autouse.pm' => '/usr/share/perl5/site_perl/Class/
Autouse.pm',
'FastNotes.pm' => '/home/chuck/fastnotes/lib/FastNotes.pm',
'Mojolicious/Plugin/HeaderCondition.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/HeaderCondition.pm',
'Mojo/Upload.pm' => '/usr/share/perl5/site_perl/Mojo/
Upload.pm',
'Fcntl.pm' => '/usr/lib/perl5/core_perl/Fcntl.pm',
'Mojo/IOWatcher.pm' => '/usr/share/perl5/site_perl/Mojo/
IOWatcher.pm',
'Symbol.pm' => '/usr/share/perl5/core_perl/Symbol.pm',
'Scalar/Util.pm' => '/usr/lib/perl5/core_perl/Scalar/
Util.pm',
'Mojolicious/Static.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Static.pm',
'Exporter.pm' => '/usr/share/perl5/core_perl/Exporter.pm',
'IO/Socket/SSL.pm' => '/usr/share/perl5/vendor_perl/IO/
Socket/SSL.pm',
'/usr/lib/perl5/vendor_perl/auto/Net/SSLeay/autosplit.ix' =>
'/usr/lib/perl5/vendor_perl/auto/Net/SSLeay/autosplit.ix',
'Mojo/ByteStream.pm' => '/usr/share/perl5/site_perl/Mojo/
ByteStream.pm',
'Mojolicious/Controller.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Controller.pm',
'UR.pm' => undef,
'Mojolicious/Command/Daemon.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Command/Daemon.pm',
'Mojo/IOLoop/EventEmitter.pm' => '/usr/share/perl5/site_perl/
Mojo/IOLoop/EventEmitter.pm',
'Encode/Encoding.pm' => '/usr/lib/perl5/site_perl/Encode/
Encoding.pm',
'Class/AutoloadCAN.pm' => '/usr/share/perl5/site_perl/Class/
AutoloadCAN.pm',
'bytes.pm' => '/usr/share/perl5/core_perl/bytes.pm',
'strict.pm' => '/usr/share/perl5/core_perl/strict.pm',
'vars.pm' => '/usr/share/perl5/core_perl/vars.pm',
'Mojo/Template.pm' => '/usr/share/perl5/site_perl/Mojo/
Template.pm',
'Mojo/Home.pm' => '/usr/share/perl5/site_perl/Mojo/Home.pm',
'Mojo/Server.pm' => '/usr/share/perl5/site_perl/Mojo/
Server.pm',
'Mojolicious/Routes/Match.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Routes/Match.pm',
'Mojo/Transaction.pm' => '/usr/share/perl5/site_perl/Mojo/
Transaction.pm',
'Mojolicious/Plugin/PoweredBy.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/PoweredBy.pm',
'unicore/Heavy.pl' => '/usr/share/perl5/core_perl/unicore/
Heavy.pl',
'Time/Local.pm' => '/usr/share/perl5/core_perl/Time/
Local.pm',
'warnings.pm' => '/usr/share/perl5/core_perl/warnings.pm',
'B.pm' => '/usr/lib/perl5/core_perl/B.pm',
'Mojo/Cache.pm' => '/usr/share/perl5/site_perl/Mojo/
Cache.pm',
'Mojolicious/Renderer.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Renderer.pm',
'Mojo/Message.pm' => '/usr/share/perl5/site_perl/Mojo/
Message.pm',
'PerlIO/encoding.pm' => '/usr/lib/perl5/core_perl/PerlIO/
encoding.pm',
'Mojo/Command.pm' => '/usr/share/perl5/site_perl/Mojo/
Command.pm',
'Mojo/Base.pm' => '/usr/share/perl5/site_perl/Mojo/Base.pm',
'Mojo/Headers.pm' => '/usr/share/perl5/site_perl/Mojo/
Headers.pm',
'Mojo/URL.pm' => '/usr/share/perl5/site_perl/Mojo/URL.pm',
'Mojo/Cookie/Request.pm' => '/usr/share/perl5/site_perl/Mojo/
Cookie/Request.pm',
'Mojo/Transaction/WebSocket.pm' => '/usr/share/perl5/
site_perl/Mojo/Transaction/WebSocket.pm',
'Mojo/DOM/Collection.pm' => '/usr/share/perl5/site_perl/Mojo/
DOM/Collection.pm',
'FastNotes/Controller/Auths.pm' => '/home/chuck/fastnotes/
lib/FastNotes/Controller/Auths.pm',
'Mojolicious/Plugin/Config.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/Config.pm',
'Time/HiRes.pm' => '/usr/lib/perl5/site_perl/Time/HiRes.pm',
'IO/Poll.pm' => '/usr/lib/perl5/core_perl/IO/Poll.pm',
'Mojo/Message/Response.pm' => '/usr/share/perl5/site_perl/
Mojo/Message/Response.pm',
'/usr/lib/perl5/vendor_perl/auto/Net/SSLeay/randomize.al' =>
'/usr/lib/perl5/vendor_perl/auto/Net/SSLeay/randomize.al',
'Mojo/IOWatcher/EV.pm' => undef,
'Mojolicious/Plugin/JsonConfig.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/JsonConfig.pm',
'Mojo/Asset.pm' => '/usr/share/perl5/site_perl/Mojo/
Asset.pm',
'Mojo/IOLoop.pm' => '/usr/share/perl5/site_perl/Mojo/
IOLoop.pm',
'Mojo/Content.pm' => '/usr/share/perl5/site_perl/Mojo/
Content.pm',
'Mojolicious/Plugin/EpRenderer.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/EpRenderer.pm',
'IO.pm' => '/usr/lib/perl5/core_perl/IO.pm',
'Mojo/IOLoop/Client.pm' => '/usr/share/perl5/site_perl/Mojo/
IOLoop/Client.pm',
'Socket.pm' => '/usr/lib/perl5/core_perl/Socket.pm',
'PerlIO.pm' => '/usr/share/perl5/core_perl/PerlIO.pm',
'Mojolicious/Plugin/TagHelpers.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Plugin/TagHelpers.pm',
'Mojolicious/Routes/Pattern.pm' => '/usr/share/perl5/
site_perl/Mojolicious/Routes/Pattern.pm',
'overload.pm' => '/usr/share/perl5/core_perl/overload.pm',
'Digest/SHA.pm' => '/usr/lib/perl5/site_perl/Digest/SHA.pm',
'Mojolicious/Types.pm' => '/usr/share/perl5/site_perl/
Mojolicious/Types.pm'
};

I don't know how:

use lib '../../storage'; <---- THIS
use FastNotesDB; <---- THIS

is preventing the foreach loop with Mojo::Loader from executing.



On Aug 15, 2:59 pm, Виктор Турский <koorc...@gmail.com> wrote:
> 2011/8/15 Chuck <cfmwes...@gmail.com>:

Chuck

unread,
Aug 16, 2011, 3:22:54 PM8/16/11
to Mojolicious
So I found out that the problem is that either UR or Mojo::Loader is
corrupting %INC, because I the Modules I want to use get set to undef,
hence it can't locate object method. I think it's most likely UR's
fault. I will give up on UR and use DBIx::Class most likely.

Thanks for the help!
> Cache.pm',...
>
> read more »

Виктор Турский

unread,
Aug 16, 2011, 3:29:24 PM8/16/11
to mojol...@googlegroups.com
2011/8/16 Chuck <cfmw...@gmail.com>:

> So I found out that the problem is that either UR or Mojo::Loader is
> corrupting %INC, because I the Modules I want to use get set to undef,
> hence it can't locate object method. I think it's most likely UR's
> fault.

I am not sure with this. I can recheck by my own but I need source code.

Chuck

unread,
Aug 16, 2011, 3:32:28 PM8/16/11
to Mojolicious
How can I send you my source? Is there a way to attach it here?

On Aug 16, 3:29 pm, Виктор Турский <koorc...@gmail.com> wrote:
> 2011/8/16 Chuck <cfmwes...@gmail.com>:

Виктор Турский

unread,
Aug 16, 2011, 3:39:29 PM8/16/11
to mojol...@googlegroups.com
2011/8/16 Chuck <cfmw...@gmail.com>:

> How can I send you my source? Is there a way to attach it here?

If you use git for your projects then you can upload code to github.com

Chuck

unread,
Aug 16, 2011, 4:46:43 PM8/16/11
to Mojolicious
OK, I created a tar file and uploaded on google and shared it with
you. Let me know if you have any questions. Again, thank you very much
for helping me with this.

On Aug 16, 3:39 pm, Виктор Турский <koorc...@gmail.com> wrote:
> 2011/8/16 Chuck <cfmwes...@gmail.com>:
>

Виктор Турский

unread,
Aug 16, 2011, 5:13:46 PM8/16/11
to mojol...@googlegroups.com
I've checked the code.
May be you are running applicatin with "morbo". And code

use FindBin;
use lib "$FindBin::Bin/../lib";

in script/fastnotes.pl does not work as expected because $FindBin::Bin
contains path to morbo directory.
Try run with "perl fastnotes.pl daemon".

If this is the problem, then correct "use lib" statements in
script/fastnotes.pl.

Chuck

unread,
Aug 16, 2011, 7:32:11 PM8/16/11
to Mojolicious
No, I'm running the application just as you suggest in the FastNotes
github project README: "perl fastnotes/script/fastnotes.pl daemon".
I'm new to Mojolicious so I don't know what is morbo either.
Reply all
Reply to author
Forward
0 new messages