[Dbix-class] convention for naming primary keys to avoidambiguousselects

Octavian Rasnita orasnita at gmail.com
Tue Nov 25 21:54:06 GMT 2008


From: "Noel Burton-Krahn" <noel at burton-krahn.com>
> This is a reasonable query:  load a person with address by the
> person's id.  The 'id' column is unambiguous in the search call.
> However, DBIx generates ambiguous SQL:
>
> DBIx::Class::ResultSet::count(): DBI Exception: DBD::mysql::st execute
> failed: Column 'id' in where clause is ambiguous [for Statement
> "SELECT COUNT( * ) FROM person me LEFT JOIN address address ON (
> address.person_id = me.id ) WHERE ( id = ? )" with ParamValues: 0='1']
> at ./t/dbix_unique_prefix_where.t line 116
>
> The simple way to fix it is to prefix "id" as "me.id".  I'd argue DBIx
> should prefix all unqualified column names in the first argument to
> search().  Asking users to rely on DBIx's current internal strategy of
> using "me" as a prefix is not safe.  What if "me" changes to "this" in
> a future release?  What if I make a table named "me"?
>
> ~Noel

Yes you are right, but maybe others already tried to find a solution for 
this, but couldn't do it.

If the query searches only in a single table, then the column name can be 
used without the table prefix.
If the query uses 2 tables, but the column name is not found in both tables, 
then the column name can be also used without a prefix.
If the query searches in 2 or more tables and the column name appears more 
than in a table, then the prefix should be added.

Well, in the first 2 cases, it is not a problem if that prefix is also 
added, so this solution can be possible.

I think that if the query needs to search in a table named "me" which is not 
the primary table, it probably gives another name instead of "me" for the 
main table, so that name shouldn't need to be hard coded in the programs.

By the way, does anyone know what happends if a secondary table is named 
"me"?

Octavian




More information about the DBIx-Class mailing list