That should be working now in r5203.  The reflection code was missing an 
edge case where an explicit schema= is the same as the connection's 
schema.  Switching those to schema=None should work as intended if you 
need a workaround on a released version.

Cheers,
Jason


Martijn Faassen wrote:
> Hi there,
> 
> I have a problem with foreign keys that seems to occur when I combine 
> reflection and explicit schemas, in the context of MySQL. I've confirmed 
> this problem with both rc2 and the trunk. It's best demonstrated with 
> some failing code:
> 
> Imagine the following MySQL database 'somedb':
> 
> CREATE TABLE somedb.a (
>    id int PRIMARY KEY auto_increment NOT NULL
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
> 
> CREATE TABLE somedb.b (
>    id int PRIMARY KEY auto_increment NOT NULL,
>    a_id int NOT NULL,
>    FOREIGN KEY (a_id) REFERENCES somedb.a(id)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
> 
> And the following code:
> 
> from sqlalchemy import *
> from sqlalchemy.orm import mapper, relation, sessionmaker
> 
> engine = create_engine('mysql:///somedb')
> meta = MetaData()
> meta.bind = engine
> 
> a_table = Table(
>      'a',
>      meta,
>      schema='somedb',
>      autoload=True)
> 
> b_table = Table(
>      'b',
>      meta,
>      schema='somedb',
>      autoload=True)
> 
> class A(object):
>      pass
> 
> 
> class B(object):
>      pass
> 
> mapper(A, a_table,
>         properties={'bs': relation(B)})
> mapper(B, b_table)
> 
> Session = sessionmaker(bind=engine)
> session = Session()
> print session.query(A).all()
> 
> When executing this code, the last line fails with the following error:
> 
> Traceback (most recent call last):
>    File "bin/devpython", line 138, in ?
>      execfile(sys.argv[0])
>    File "experiment.py", line 33, in ?
>      print session.query(A).all()
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/session.py",
>  
> line 914, in query
>      return self._query_cls(entities, self, **kwargs)
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/query.py",
>  
> line 95, in __init__
>      self.__setup_aliasizers(self._entities)
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/query.py",
>  
> line 109, in __setup_aliasizers
>      mapper, selectable, is_aliased_class = _entity_info(entity)
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/util.py",
>  
> line 454, in _entity_info
>      mapper = class_mapper(entity, compile)
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/util.py",
>  
> line 531, in class_mapper
>      mapper = mapper.compile()
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/mapper.py",
>  
> line 371, in compile
>      mapper.__initialize_properties()
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/mapper.py",
>  
> line 393, in __initialize_properties
>      prop.init(key, self)
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/interfaces.py",
>  
> line 384, in init
>      self.do_init()
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/properties.py",
>  
> line 531, in do_init
>      self._determine_joins()
>    File 
> "/home/faassen/.buildout/eggs/SQLAlchemy-0.5.0rc2-py2.4.egg/sqlalchemy/orm/properties.py",
>  
> line 604, in _determine_joins
>      raise sa_exc.ArgumentError("Could not determine join condition 
> between "
> sqlalchemy.exc.ArgumentError: Could not determine join condition between 
> parent/child tables on relation A.bs.  Specify a 'primaryjoin' 
> expression.  If this is a many-to-many relation, 'secondaryjoin' is 
> needed as well.
> 
> This code *only* fails if I designate an explicit 'schema' in the table 
> statements. If I leave these out, things work as expected. Since I'm 
> interested in working with reflected tables that reside in multiple 
> schemas, this is a problem.
> 
> Digging around indicates this that _search_for_join, defined in 
> _determine_joins, does not actually find the join clause. Going deeper 
> traces the failure down to the Join class in sqlalchemy.sql.expression, 
> which fails in self._match_primaries in its __init__ method. This in 
> turn brings us to sqlalchemy.sql.util.join_condition, which has 
> fk.get_referent() return None if schemas are explicitly specified, and 
> work fine if not.
> 
> fk.get_referent() uses corresponding_column, and this in turn tries to 
> use contains_column() which returns False in the schema case, but true 
> if 'schema' is not explicitly verified.
> 
> Why I don't know. The repr of the column passed into contains_column 
> looks the same as the repr of the column in the table, but apparently 
> it's not exactly the same instance. Something somewhere is making the 
> column to be different.
> 
> Is this a bug? If so, how would we go around solving it?
> 
> Regards,
> 
> Martijn
> 
> 
> 
> 
> > 


--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to