On May 10, 1:53 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
> the second version is not going to work because you are expressing
> the joins and foreign keys in terms of the underlying tables, not the
> relations to which the mappers are bound (i.e. T1_select,
> T2_select). so the mapper cant do anything with that (more
OK. I guess I find it surprising because I expeced that:
T1.c.id is T1_select.c.id
That is, I expected the select to just reference the Column objects
from the table, not to have copies of them, so I thought the two joins
would be identical.
But now I have another problem - I've fixed my mappers to join
properly, but I'm getting SQL that mssql 2005 chokes on. Here's a
condensed version of my original example:
########
from sqlalchemy import *
meta = MetaData()
T = Table('T', meta,
Column('id', Integer, primary_key=True),
Column('ver', Integer, primary_key=True),
)
maxvers = select(
[T.c.id.label('mvid'), func.max(T.c.ver).label('maxver')],
group_by=[T.c.id],
)
# Try two different ways:
select_1 = select(
columns = [T],
from_obj = [T, maxvers],
whereclause = and_(maxvers.c.mvid==T.c.id,
maxvers.c.maxver==T.c.ver),
).alias('select_1')
select_2 = select(
columns = [T],
from_obj = [join(T, maxvers,
onclause=and_(maxvers.c.mvid==T.c.id, maxvers.c.maxver==T.c.ver))],
).alias('select_2')
class One(object): pass
class Two(object): pass
m1 = mapper(One, select_1)
m2 = mapper(Two, select_2)
e = create_engine('mssql://sa:[EMAIL PROTECTED]/test')
meta.create_all(e)
s = create_session(bind_to=e)
e.echo = True
# Both of the following fail on MSSQL 2005
try:
s.query(m1).select()
except Exception, e:
print e
try:
s.query(m2).select()
except Exception, e:
print e
########
The first error is "Incorrect syntax near the keyword 'WHERE'" for:
SELECT select_1.ver AS select_1_ver, select_1.id AS select_1_id
FROM (SELECT [T].id AS id, [T].ver AS ver
FROM [T], (SELECT [T].id AS mvid, max([T].ver) AS maxver
FROM [T] GROUP BY [T].id)
WHERE mvid = [T].id AND [T].ver = maxver) AS select_1 ORDER BY
select_1.id
The second is "Incorrect syntax near the keyword 'ON'" for:
SELECT select_2.ver AS select_2_ver, select_2.id AS select_2_id
FROM (SELECT [T].id AS id, [T].ver AS ver
FROM [T] JOIN ((SELECT [T].id AS mvid, max([T].ver) AS maxver
FROM [T] GROUP BY [T].id)) ON mvid = [T].id AND [T].ver = maxver) AS
select_2 ORDER BY select_2.id
I think that for the second one, it's just complaining about the
doubled brackets around the nested query. If I paste it into the SQL
Server UI and run it, it works only if I remove the extra set of
brackets.
I have no idea what's wrong with the first one. If I paste that one
into SQL Server UI, it runs correctly, but it rewrites it to this:
SELECT ver AS select_1_ver, id AS select_1_id
FROM (SELECT T.id, T.ver
FROM T INNER JOIN
(SELECT id AS
mvid, MAX(ver) AS maxver
FROM T AS
T_1
GROUP BY id) AS
derivedtbl_1 ON T.id = derivedtbl_1.mvid AND T.ver =
derivedtbl_1.maxver) AS select_1_1
ORDER BY select_1_id
Any idea how I can write my selects to work against SQL server?
Thanks,
Chris Perkins
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---