DBIx::Class::Manual::Troubleshooting - Got a problem? Shoot it.
You're trying to make a query on a non-connected schema. Make sure you got the current resultset from $schema->resultset('Artist') on a schema object you got back from connect().
The DBIC_TRACE environment variable controls SQL tracing, so to see what is happening try
DBIC_TRACE
export DBIC_TRACE=1
Alternatively use the storage->debug class method:-
storage->debug
$class->storage->debug(1);
To send the output somewhere else set debugfh:-
$class->storage->debugfh(IO::File->new('/tmp/trace.out', 'w');
Alternatively you can do this with the environment variable too:-
export DBIC_TRACE="1=/tmp/trace.out"
For some reason the table class in question didn't load fully, so the ResultSource object for it hasn't been created. Debug this class in isolation, then try loading the full schema again.
Older DBI and DBD::Pg versions do not handle last_insert_id correctly, causing code that uses auto-incrementing primary key columns to fail with a message such as:
last_insert_id
Can't get last insert id at /.../DBIx/Class/Row.pm line 95
In particular the RHEL 4 and FC3 Linux distributions both ship with combinations of DBI and DBD::Pg modules that do not work correctly.
DBI version 1.50 and DBD::Pg 1.43 are known to work.
There's likely a syntax error in the table class referred to elsewhere in this error message. In particular make sure that the package declaration is correct, so for a schema MySchema you need to specify a fully qualified namespace: package MySchema::MyTable; for example.
MySchema
package MySchema::MyTable;
This can happen if you have a relation whose name is a word reserved by your database, e.g. "user":
package My::Schema::User; ... __PACKAGE__->table('users'); __PACKAGE__->add_columns(qw/ id name /); __PACKAGE__->set_primary_key('id'); ... 1; package My::Schema::ACL; ... __PACKAGE__->table('acl'); __PACKAGE__->add_columns(qw/ user_id /); __PACKAGE__->belongs_to( 'user' => 'My::Schema::User', 'user_id' ); ... 1; $schema->resultset('ACL')->search( {}, { join => [qw/ user /], '+select' => [ 'user.name' ] } );
The SQL generated would resemble something like:
SELECT me.user_id, user.name FROM acl me JOIN users user ON me.user_id = user.id
If, as is likely, your database treats "user" as a reserved word, you'd end up with the following errors:
1) syntax error at or near "." - due to "user.name" in the SELECT clause
2) syntax error at or near "user" - due to "user" in the JOIN clause
The solution is to enable quoting - see "Setting_quoting_for_the_generated_SQL" in DBIx::Class::Manual::Cookbook for details.
Note that quoting may lead to problems with order_by clauses, see "... column "foo DESC" does not exist ..." for info on avoiding those.
order_by
This can happen if you've turned on quoting and then done something like this:
$rs->search( {}, { order_by => [ 'name DESC' ] } );
This results in SQL like this:
... ORDER BY "name DESC"
The solution is to pass your order_by items as scalar references to avoid quoting:
$rs->search( {}, { order_by => [ \'name DESC' ] } );
Now you'll get SQL like this:
... ORDER BY name DESC
To install DBIx::Class, copy and paste the appropriate command in to your terminal.
cpanm
cpanm DBIx::Class
CPAN shell
perl -MCPAN -e shell install DBIx::Class
For more information on module installation, please visit the detailed CPAN module installation guide.