- added synchronization to the mapper() construction step, to avoid
thread collections when pre-existing mappers are compiling in a
different thread [ticket:613]
+ - a warning is issued by Mapper when two primary key columns of the
+ same name are munged into a single attribute. this happens frequently
+ when mapping to joins (or inheritance).
- synonym() properties are fully supported by all Query joining/
with_parent operations [ticket:598]
- fixed very stupid bug when deleting items with many-to-many
from sqlalchemy.orm import util as mapperutil
from sqlalchemy.orm import sync
from sqlalchemy.orm.interfaces import MapperProperty, MapperOption, OperationContext, SynonymProperty
-import weakref
+import weakref, warnings
__all__ = ['Mapper', 'MapperExtension', 'class_mapper', 'object_mapper', 'EXT_PASS', 'mapper_registry', 'ExtensionOption']
prop = ColumnProperty(deferred=prop.deferred, group=prop.group, *prop.columns)
prop.set_parent(self)
self.__props[column_key] = prop
+ if column in self.primary_key and prop.columns[-1] in self.primary_key:
+ warnings.warn(RuntimeWarning("On mapper %s, primary key column '%s' is being combined with distinct primary key column '%s' in attribute '%s'. Use explicit properties to give each column its own mapped attribute name." % (str(self), str(column), str(prop.columns[-1]), column_key)))
prop.columns.append(column)
self.__log("appending to existing ColumnProperty %s" % (column_key))
else:
'roles' : relation(Role, secondary=user_roles, lazy=False, private=False)
}
)
- admin_mapper = mapper(Admin, admins, inherits=user_mapper)
+ admin_mapper = mapper(Admin, admins, inherits=user_mapper, properties={'aid':admins.c.id})
sess = create_session()
adminrole = Role('admin')
sess.save(adminrole)
}
)
- admin_mapper = mapper(Admin, admins, inherits=user_mapper)
+ admin_mapper = mapper(Admin, admins, inherits=user_mapper, properties={'aid':admins.c.id})
# create roles
adminrole = Role('admin')
def define_tables(self, metadata):
global a, b, c, d
a = Table("a", metadata,
- Column('id', Integer, primary_key=True),
+ Column('aid', Integer, primary_key=True),
Column('data', String(30)))
b = Table("b", metadata,
- Column('id', Integer, primary_key=True),
- Column("a_id", Integer, ForeignKey("a.id")),
+ Column('bid', Integer, primary_key=True),
+ Column("a_id", Integer, ForeignKey("a.aid")),
Column('data', String(30)))
c = Table("c", metadata,
- Column('id', Integer, primary_key=True),
- Column("b_id", Integer, ForeignKey("b.id")),
+ Column('cid', Integer, primary_key=True),
+ Column("b_id", Integer, ForeignKey("b.bid")),
Column('data', String(30)))
d = Table("d", metadata,
- Column('id', Integer, primary_key=True),
- Column("a_id", Integer, ForeignKey("a.id")),
+ Column('did', Integer, primary_key=True),
+ Column("a_id", Integer, ForeignKey("a.aid")),
Column('data', String(30)))
def test_o2m_oncascade(self):
class A(object):pass