On Oct 9, 2012, at 5:42 PM, Michael Bayer wrote: > > On Oct 9, 2012, at 2:17 PM, Benjamin Gonzalez wrote: > >> >> Thanks for the valuable suggestions. You are actually correct: the scheme >> that they are using is sharding across tables, that's why the structure is >> the same. >> >> And the way I was setting things up is very similar to the example you >> mentioned (http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName) so >> that I could query multiple table names using the same class. I put together >> a small example that using that and a simplified version of Manager and >> Engineer. Constructing the union the way you suggested works (the criterion >> goes in the subquery's WHERE clause instead of outside of the union). >> >> SELECT anon_1.manager_employee_id AS anon_1_manager_employee_id, >> anon_1.manager_name AS anon_1_manager_name >> FROM (SELECT manager.employee_id AS manager_employee_id, manager.name AS >> manager_name >> FROM manager >> WHERE manager.name = :name_1 UNION ALL SELECT engineer.employee_id AS >> engineer_employee_id, engineer.name AS engineer_name >> FROM engineer >> WHERE engineer.name = :name_2) AS anon_1 >> >> But now the problem seems to be that SQLAlchemy will only return rows >> matching the first class. >> >> Here's the example code. In this case there is 1 row in the manager & >> engineer tables that contains the name "test". After constructing the union, >> I was hoping the query would return two results but it will only return one. >> However if I run count() on the query, it correctly states that there are >> two rows. Am I missing something else? > > Unfortunately what you're trying to do is nearly impossible. I spent about > an hour trying to come up with any kind of workaround; the only workaround, > which barely works, is attached. Concrete inheritance is required since > you're looking to load polymorphically, and some direct manipulation of > column expressions is needed so that the "polymorphic" lookup works. Maybe > it will be useful, though I don't know if this approach can handle more > complexity than what we have in the current "hello world" version you see > here. > > I'd need to add new ORM features and apis to make this possible (the irony > when people say we have too many features). I don't necessarily have a > plan for how this feature would be supported, though. It's kind of turning > the usual ORM loading interaction inside-out.
OK, heh, this will work in 0.7 or 0.8, just the argument name was wrong: e_ = literal_column("'engineer'").label('pjoin_type') m = literal_column("'manager'").label('pjoin_type') u = s.query(Engineer, e_).filter(Engineer.name.in_(['e2', 'e3'])) u2 = s.query(Manager, m).filter(Manager.name.in_(['m2', 'm3'])) u = union_all(u, u2) q = s.query(Employee).with_polymorphic('*', u, u.c.pjoin_type).from_statement(u) print q.all() getting closer ! -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.