Hi!
On Sat, Jun 15, 2013 at 10:35:17PM +0400, Oleg Broytman <ph...@ph...> wrote:
> On Fri, Jun 14, 2013 at 04:57:10PM -0400, Rhubarb Sin <rhu...@gm...> wrote:
> > I was surprised when I recently discovered I had to add an extra
> > underscore to use a SQLObject class's foreign key ID when using
> > sqlobject.sqlbuilder.Outer. For example, this works:
> >
> > EXISTS(Select(Foo.q.id, where=Outer(Bar).q.foo_ID == Foo.q.id))
> >
> > This does not work:
> >
> > EXISTS(Select(Foo.q.id, where=AND(Outer(Bar).q.fooID == Foo.q.id)))
>
> What is going on is this: Outer works only symbolically - it
> generates column names without looking into class definition. That is,
> Outer(Bar).q.foo_ID puts "bar.foo_ID" into an SQL query and
> Outer(Bar).q.fooID generates "bar.fooID" without testing if such columns
> exist. There is no column fooID in table bar, hence the second query
> produces an error. There is a column foo_id, and bar.foo_ID works
> because SQL is case-insensitive language.
>
> If you read sqlbuilder.py you can find that Outer implemented using
> Table and Field helper classes. I can replace them with SQLObjectField
> and SQLObjectTable:
>
> class SQLObjectOuterField(SQLObjectField):
> def tablesUsedImmediate(self):
> return []
>
> class SQLObjectOuterTable(SQLObjectTable):
> FieldClass = SQLObjectOuterField
>
> class SQLObjectOuter:
> def __init__(self, table):
> self.q = SQLObjectOuterTable(table)
>
> Now SQLObjectOuter(Bar).q.foo_ID doesn't work but
> SQLObjectOuter(Bar).q.fooID works exactly as you expected, as well as
> SQLObjectOuter(Bar).q.foo.
>
> I think I can change the implementation of Outer in sqlbuilder using
> SQLObjectTable/Field helper but that requires a lot of testing. I doubt
> I will have time for it in June.
I tested this, it works, so I committed the change at the revision 4613:
http://sourceforge.net/mailarchive/forum.php?thread_name=E1Uwysp-0003DP-4G%40webwareforpython.org&forum_name=sqlobject-cvs
This is a major API change IMO so I'm cautious and only committed to
the trunk.
Do you want me to release a beta version so you can test it with your
code?
Oleg.
--
Oleg Broytman http://phdru.name/ ph...@ph...
Programmers don't die, they just GOSUB without RETURN.
|